Модель представления ASP.NET MVC не привязывается к HTTP-сообщению с помощью DropDownList

У меня проблема: когда я отправляю сообщение в контроллер, я теряю привязку, и все в моей модели представления равно NULL. Вот код, который я использую:

Просмотр:

@model ArticleCategoryVm

@using (@Html.BeginForm())
{
    @Html.HiddenFor(model => model.LanguageIdDisplayed)

    <label>Name: <span class="label label-important">Required</span></label>
    @Html.HmlValidationFor(model => model.CategoryName)
    @Html.TextBoxFor(model => model.CategoryName, new { maxlength = "255", placeholder = "Category Name", @class = "input-xlarge-fluid" })                  
    <span class="help-block">The is the name of the category and how it appears on the site.</span>

    <label>Language: <span class="label label-important">Required</span></label>
    @Html.HmlValidationFor(model => model.LanguageId)
    @Html.DropDownList("LanguageId", new SelectList(@Model.Languages, "Value", "Text"), "Select language", new { @class="input-xlarge-fluid" })
    <span class="help-block">This will be the language that the category is set too.</span>

    <label>Parent:</label>
    @Html.HmlValidationFor(model => model.CategoryParentId)
    @Html.DropDownList("CategoryParentId", new SelectList(@Model.CategoryParents, "Value", "Text"), new { @class = "input-xlarge-fluid" })
    <span class="help-block">Allows you to group the category under another existing category.</span>

    <label>Moderator Email: <span class="label label-important">Required</span></label>
    @Html.HmlValidationFor(model => model.ModeratorEmail)
    @Html.TextBoxFor(model => model.ModeratorEmail, new { maxlength = "255", placeholder = "Email Address", @class = "input-xlarge-fluid" })
    <span class="help-block">This is the moderator email for articles in this category.</span>

    <button type="submit" class="btn btn-duadua btn-small"><i class="icon-ok-3"></i> Add New Category</button>                      
}

Модель представления:

public class ArticleCategoryVm : BaseLayoutVm
{
    public int LanguageIdDisplayed;
    public List<ArticleCategoryItemVm> ArticleCategoryItemVms { get; set; }

    // Add Category Fields
    [Required]
    public string CategoryName;

    [EmailAttribute]
    [Required]
    public string ModeratorEmail;

    [Required]
    public int LanguageId;

    public int CategoryParentId;

    public List<SelectListItem> Languages { get; set; }
    public List<SelectListItem> CategoryParents { get; set; }
}

Контроллер:

[HttpPost]
public ActionResult Categories(ArticleCategoryVm vm)
{
   // Code here
   if (ModelState.IsValid)
   {
   }

   ReDrawDropDowns(vm);
   return View(vm)
}

Почему все в моей модели представления NULL? Используя инструменты Chrome, я вижу, что в сообщении публикуются значения для строк и целых чисел... В качестве обходного пути я только что сделал следующее, чтобы заставить код работать:

Контроллер временного решения:

[HttpPost]
public ActionResult Categories(int LanguageIdDisplayed, string CategoryName, string ModeratorEmail, int LanguageId, int CategoryParentId)
{
    var vm = new ArticleCategoryVm()
    {
        CategoryName = CategoryName,
        LanguageIdDisplayed = LanguageIdDisplayed,
        ModeratorEmail = ModeratorEmail,
        LanguageId = LanguageId,
        CategoryParentId = CategoryParentId
    };

    if (ModelState.IsValid)
    {
    }

    ReDrawDropDowns(vm);
    return View(vm)
}

Спасибо


person Danny Brady    schedule 05.03.2013    source источник


Ответы (3)


Похоже, это может быть из-за разницы между свойствами и переменными, как указано в этом вопросе . Добавьте { get; set; } ко всем переменным, которые вы хотите связать. Как отмечалось в этом вопросе, я думаю, что это связано с тем, как связыватель модели по умолчанию использует отражение.

Раньше я считал полезным получить исходный код ASP.NET MVC, чтобы отлаживать его и смотреть, что происходит.

person Rob West    schedule 05.03.2013
comment
Это сводило меня с ума. Иногда не видишь того, что прямо перед глазами. - person Samurai Ken; 26.06.2015
comment
Это исправление сработало отлично. Меня это тоже сводило с ума, так как я четко видел опубликованные данные во время мониторинга запроса. - person Jeremy Ray Brown; 17.10.2016

Есть еще одна причина, по которой модель просмотра равна NULL:

  • Имя модели в параметре действия должно совпадать с одним из свойств модели представления

<ч> Пример:

Модель:

public class NewBookPageView{
  int blabla {get;set;}
  Book NewBook {get;set;} //NewBook is the same as newBook in action parameter
}

контроллер:

[HttpPost]
public ActionResult AddNewBook(NewBookPageView newBook)//newBook is the same as NewBook in view
{
   int temp = newBook.blabla;
   temp++;
   //...
}


Совет. Здесь одно и то же имя означает отсутствие учета регистра (newBook — это то же самое, что и NewBook).

Совет. Встречается в MVC3 и MVC4.

person Iman Mahmoudinasab    schedule 26.08.2013
comment
Я только что попался на этом ... кажется, много скрытых зарезервированных слов / правил с именами параметров действия ... несколько дней назад я хотел иметь параметр под названием «действие», который сломал мою маршрутизацию! Где-то под капотом я предполагаю, что он создает анонимный объект, такой как анонимный объект значений маршрута, который превращает эти параметры в свойства этого объекта, поэтому, если вы используете имя, такое как «контроллер», «действие» и т. д., это все портит. - person Ste W; 29.05.2014

Для моделирования привязки в представлении следует использовать сильно типизированные-html-помощники

заменять

@Html.DropDownList("CategoryParentId", new SelectList(@Model.CategoryParents, "Value", "Text"), new { @class = "input-xlarge-fluid" })

to:

@Html.DropDownListFor(model => model.CategoryParentId, new SelectList(@Model.CategoryParents, "Value", "Text"), new { @class = "input-xlarge-fluid" })
person AliRıza Adıyahşi    schedule 05.03.2013