Привязка модели ASP.NET MVC 2: Как отладить частично неудачную привязку модели при обратной передаче? - PullRequest
0 голосов
/ 04 августа 2010

У нас была модель представления, которая выглядела так:

public class myViewModel {
    public Contract contract {get;set;}
    public Vendor vendor {get;set;}
}

public class Contract {
    public int contractID {get;set;}
    // ... various string properties
    public IList<ContractDetail> contractDetails {get;set;}
    pubilc Vendor vendor {get;set;}
}

Возвращаясь из формы, был завершенный контракт.

[HttpPost]
public ActionResult Edit(Contract contract) { ... }

Все сработало, привязывая значения формы сообщения обратно к свойствам параметра контракта.

Когда мы переместили продавца в Контракт в качестве ценностного объекта, все «примитивные» свойства Контракта первого уровня не связываются. Все свойства IList <> в порядке.

Есть идеи или какая дополнительная информация нам понадобится, чтобы разгадать эту загадку? Есть ли способ проверить, как MVC связывает значения формы с параметрами объекта? Это решение связано с тем, что Vendor не является IList, то есть почему свойства IList будут работать нормально?

Edit:

Исправление состояло в том, чтобы абсолютно указать имена иерархии объектов во всех полях, например, для привязки имени поставщика, требовалось имя "Contract.vendor.name". Этот префикс был сделан для нас с использованием ViewModel, но не для нас с использованием модели контракта. В итоге мы сделали это для всех шаблонов представлений (частичных представлений):

EditorFor(m => m.vendor, "Vendor", "Contract.vendor")

где "Vendor" - это имя EditorTemplate "Vendor.ascx", а "Contract.vendor" префикс всех имен полей формы.

Полагаю, поскольку ViewModel вложил все данные, он заставил MVC правильно задать префикс всех свойств. Это будет означать, что «свободные» поля формы, не определенные префиксами объектов, не будут привязаны к объектам именованных параметров.

1 Ответ

2 голосов
/ 04 августа 2010

Просто скачайте исходный код mvc , создайте ссылку на проект и выполните отладку через связыватель по умолчанию.

...