Модель привязки вложенных свойств в asp.net mvc
Я хочу получить привязку к работе в моем приложении mvc. Я обнаружил, что вложенные свойства автоматически не связаны связующим устройством по умолчанию в RC1-выпуске asp.net mvc. У меня есть следующая структура классов:
public class Contact{
public int Id { get; set; }
public Name Name { get; set; }
public string Email { get; set; }
}
Где Name
определяется как:
public class Name{
public string Forename { get; set; }
public string Surname { get; set; }
}
Мой вид определяется по строкам:
using(Html.BeginForm()){
Html.Textbox("Name.Forename", Model.Name.Forename);
Html.Textbox("Name.Surname", Model.Name.Surname);
Html.Textbox("Email", Model.Email);
Html.SubmitButton("save", "Save");
}
Мое действие контроллера определяется как:
public ActionResult Save(int id, FormCollection submittedValues){
Contact contact = get contact from database;
UpdateModel(contact, submittedValues.ToValueProvider());
//at this point the Name property has not been successfully populated using the default model binder!!!
}
Свойство Email
успешно привязано, но не свойства Name.Forename
или Name.Surname
. Может ли кто-нибудь сказать, должно ли это работать с использованием связующего устройства по умолчанию, и я делаю что-то неправильно или если оно не работает, и мне нужно свернуть собственный код для привязки вложенных свойств к объектам модели?
Ответы
Ответ 1
Я думаю, проблема связана с префиксом Name в свойствах. Я думаю, вам нужно будет обновить его как две модели и указать префикс для второго. Обратите внимание, что я удалил FormCollection
из параметров и использовал подпись UpdateModel
, которая полагается на встроенный поставщик значений, и указывает белый список свойств, которые нужно учитывать.
public ActionResult Save( int id )
{
Contact contact = db.Contacts.SingleOrDefault(c => c.Id == id);
UpdateModel(contact, new string[] { "Email" } );
string[] whitelist = new string[] { "Forename", "Surname" };
UpdateModel( contact.Name, "Name", whitelist );
}
Ответ 2
Это очень интересно, потому что если вы сделали
public ActionResult Save( int id, Contact contact )
{
//contact here would contain the nested values.
}
Я использую это с большим успехом.
Полагаю, тогда вы могли бы как-то синхронизировать два объекта Contact.
Я бы подумал, что UpdateModel и привязка к параметру используют один и тот же вызов за кулисами. примечание: не пытались воспроизвести вашу проблему.
Ответ 3
Чтобы связать имя, а не всю модель представления в POST, необходимо проинструктировать связующее устройство модели, что будет использоваться префикс. Это делается с использованием BindAttribute.
public ActionResult AddComment([Bind(Prefix = "Name")] Name name)
{
//do something
}