2013-03-05 5 views
13

У меня возникла проблема, когда при отправке на контроллер я теряю привязку и все в моей модели просмотра NULL. Вот код, я использую:ASP.NET MVC View Model не привязана к HTTP-сообщению с DropDownList

Вид:

@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>      
} 

ViewModel:

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? Я могу видеть в использовании Chromes инструментов, которые в пост значения, размещаются для струнных и Интс ... В работе вокруг я только что сделал следующее, чтобы получить код работы:

Обход контроллера:

[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) 
} 

Благодаря

ответ

39

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

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

+2

Это заставило меня ОНУТРИ. Иногда вы не видите, что прямо перед вашими глазами. –

+0

Это исправление отлично работает. Это тоже заводило меня с ума, так как я отчетливо видел данные, находящиеся во время наблюдения за запросом. –

2

Для моделирования связывания с точки зрения вы должны использовать strongly-typed-html-helpers

заменяющие

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

к:

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

Существует еще одна причина для зрения модели является 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 d MVC4.

+2

Я только что поймал этот ... кажется, много скрытых зарезервированных слов/правил с именами параметров действия ... Несколько дней назад я хотел иметь параметр под названием «действие», которое нарушило мою маршрутизацию! Где-то под капотом я предполагаю, что он создает анонимный объект, например, анонимный объект, который передает эти параметры в свойства этого объекта, поэтому, если вы используете имя типа «контроллер», «действие» и т. Д., Оно закручивает вещи вверх. –

+1

Видел также в MVC5 –

 Смежные вопросы

  • Нет связанных вопросов^_^