Подтвердить что ты не робот

Модель привязки вложенных свойств в 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. Может ли кто-нибудь сказать, должно ли это работать с использованием связующего устройства по умолчанию, и я делаю что-то неправильно или если оно не работает, и мне нужно свернуть собственный код для привязки вложенных свойств к объектам модели?

4b9b3361

Ответ 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
}