Модель привязки вложенных свойств в asp.net mvc - PullRequest
12 голосов
/ 27 февраля 2009

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

Ответы [ 3 ]

9 голосов
/ 27 февраля 2009

Я думаю, что проблема связана с префиксом 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 );
 }
5 голосов
/ 04 апреля 2012

Связывать имя, а не всю модель представления в POST, означает указывать связующему модели, что будет использоваться префикс. Это делается с помощью BindAttribute.

public ActionResult AddComment([Bind(Prefix = "Name")] Name name)
{
  //do something
}
4 голосов
/ 27 февраля 2009

Это очень интересно, потому что если бы вы сделали

public ActionResult Save( int id, Contact contact )
{
    //contact here would contain the nested values.
}

Я использую это с большим успехом. Полагаю, тогда вы могли бы как-то синхронизировать два объекта Contact вместе.

Я бы подумал, что UpdateModel и привязка к параметру используют один и тот же вызов за кулисами. примечание: не пытался воспроизвести вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...