Сложный объект и привязка модели ASP.NET MVC

У меня есть структура объекта-объекта с classом Foo который содержит строку со строковым значением.

 public class Foo { public Bar Bar; } public class Bar { public string Value { get; set; } } 

И модель представления, которая использует эту структуру, подобную этой

 public class HomeModel { public Foo Foo; } 

Тогда у меня есть форма, что в Razor выглядит примерно так.

  
@using (Html.BeginForm("Save", "Home", FormMethod.Post)) {
@Html.TextBoxFor(m => m.Foo.Bar.Value)
}

В html, который становится.

 

Наконец, controller для обработки столбцов вроде этого

 [HttpPost] public ActionResult Save(Foo foo) { // Magic happends here return RedirectToAction("Index"); } 

Моя проблема в том, что Bar in Foo имеет значение null когда он нажимает на действие controllerа Save ( Foo создается, но с полем null Bar ).

Я думал, что модельное связующее в MVC сможет создать объект Foo и Bar и установить свойство Value если оно выглядит так, как показано выше. Что мне не хватает?

Я также знаю, что моя модель просмотра немного сложнее и может быть проще, но я за то, что я пытаюсь сделать, действительно помог бы мне, если бы мог использовать более глубокую структуру объекта. В приведенных выше примерах используется ASP.NET 5.

Во-первых, DefaultModelBinder не привязывается к полям, поэтому вам нужно использовать свойства

 public class HomeModel { public Foo Foo { get; set; } } 

Во-вторых, помощники генерируют элементы управления на основе HomeModel но вы отправляете обратно в Foo . Либо измените метод POST, либо

 [HttpPost] public ActionResult Save(HomeModel model) 

или используйте BindAttribute чтобы указать Prefix (который по существу BindAttribute значение префикса из опубликованных значений – поэтому Foo.Bar.Value становится Bar.Value для целей привязки)

 [HttpPost] public ActionResult Save([Bind(Prefix="Foo")]Foo model) 

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

Я только что открыл еще одну причину, которая может произойти, если ваша собственность называется « Settings ! Рассмотрим следующую модель просмотра:

 public class SomeVM { public SomeSettings DSettings { get; set; } // named this way it will work public SomeSettings Settings { get; set; } // property named 'Settings' won't bind! public bool ResetToDefault { get; set; } } 

В коде, если вы привязываетесь к свойству « Settings , он не может связываться (не только по почте, но даже при создании формы). Если вы переименуете « Settings в « DSettings (и т. Д.), Он снова работает снова.

У меня была такая же проблема, и после того, как я последовал за действиями @Stephen Muecke, я понял, что проблема была вызвана тем, что мои входы были отключены (я отключил их с помощью JQuery на готовом документе), как вы можете видеть здесь: как мне отправить отключенный ввод в ASP.NET MVC? , В конце я использовал только для чтения, а не для отключенного атрибута, и все значения были успешно отправлены на controller.

У меня была такая же проблема, но как только я создал HIDDEN FIELD для внешнего ключа … все это работало просто отлично …

ПРИМЕР ФОРМЫ:

 @using (Html.BeginForm("save", "meter", FormMethod.Post)) { @Html.AntiForgeryToken() @Html.ValidationSummary(true) @Html.HiddenFor(model => Model.Entity.Id) @Html.HiddenFor(model => Model.Entity.DifferentialMeter.MeterId) @Html.HiddenFor(model => Model.Entity.LinearMeter.MeterId) @Html.HiddenFor(model => Model.Entity.GatheringMeter.MeterId) ... all your awesome controls go here ... } 

ПРИМЕР ДЕЙСТВИЯ:

 // POST: /Meter/Save [HttpPost] public ActionResult Save(Meter entity) { ... world-saving & amazing logic goes here ... } 

КРАСИВЫЕ КАРТИНКИ:
введите описание изображения здесь

  • Метод Razor ViewEngine HTML.Checkbox создает скрытый ввод. Зачем?
  • Добавление classа css для выбора с помощью @ Html.DropDownList ()
  • Как импортировать пространство имен на странице просмотра Razor?
  • Razor View Engine: дерево выражений может не содержать динамическую операцию
  • Загрузка частичного представления в jquery.dialog
  • Предоставление частичных представлений с использованием ajax
  • Загрузка ASP.NET MVC Razor из базы данных
  • MVC 5.1 Razor DisplayFor не работает с Enum DisplayName
  • Почему Html.Raw ускоряет амперсанд в привязном теге в ASP.NET MVC 4?
  • Как сделать раздел в частичном представлении в MVC3?
  • Что такое синтаксис @ Html.DisplayFor?
  • Interesting Posts

    Декомпиляция библиотек Objective-C

    Как устранить асимметричную скорость PPTP VPN? (Нисходящая линия к клиенту медленная, пропускная способность сервера и отсутствие накладных расходов на шифрование)

    Передача данных в дочерние компоненты маршрутизатора-выхода (угловые 2)

    Проверьте, содержит ли один список элемент из другого

    Как вы можете тестировать частные методы?

    Смущает разница между let и let * в Scheme

    DependencyProperty getter / setter не вызывается

    Случайное число с вероятностями

    Самый эффективный способ использования замены нескольких слов в строке

    Как сделать размер экрана GridLayout подходящим

    bash: заставить exec’d обрабатывать небуферизованный stdout

    получить и установить в TypeScript

    Firefox Add-on RESTclient – Как вводить параметры POST?

    Создание шкалы Viewbox по вертикали, но растяжение по горизонтали

    Есть ли инструменты для выравнивания динамических дисков в Windows 7?

    Давайте будем гением компьютера.