привязка модели по умолчанию не работает в случае, если модель содержит модель - PullRequest
1 голос
/ 22 декабря 2011

Вот моя модель.

public class InfoModel
    {
        public NameModel Name { get; set; }
        public string Phone { get; set; }
    }

public class NameModel
    {
        public string FirstName { get; set; }
        public string LastName  { get; set; }

        public NameModel(string first, string last)
        {
            this.FirstName = first;
            this.LastName = last;
        }
    }

Тогда у меня есть частичное представление только для отображения имен следующим образом

@model MyTestApp.Models.NameModel

@Html.LabelFor( m => m.LastName) 
@Html.TextBoxFor( m => m.LastName)       
<br />
@Html.LabelFor( m => m.FirstName) 
@Html.TextBoxFor( m => m.FirstName)       

Тогда есть представление для ShowInfo

@model MyTestApp.Models.InfoModel

@using (@Html.BeginForm())
{
    @Html.Partial("ShowName", Model.Name)
    <br />
    @Html.LabelFor( m => m.Phone) 
    @Html.TextBoxFor(m => m.Phone)
    <br />
   <input type="submit" value="Submit Info" />
}

Теперь пользователь отправляет любую информацию, следующий метод контроллера называется

 [HttpPost]
 public ActionResult ShowInfo(InfoModel model)
 {
    ...
 }

Проблема в том, что, когда я проверяю значение модели, телефон в порядке, но имя равно нулю. Есть идеи как заставить это работать?

Ответы [ 2 ]

1 голос
/ 22 декабря 2011

Класс DefaultModelBinder использует Activator.CreateInstance(typeToCreate) для создания классов модели. Ваш класс NameModel не имеет конструктора по умолчанию, поэтому DefaultModelBinder не может создать его экземпляр. Так что если вы добавите конструктор по умолчанию, он должен работать.

EDIT Частичное представление не будет работать, вместо этого вам нужно использовать EditorTemplate:
Создайте папку под вашей папкой вида с именем EditorTemplates и поместите туда свой ShowName.cshtml и добавьте в свой основной вид:

@using(Html.BeginForm())
{
    @Html.EditorFor(m => m.Name, "ShowName")
    ...
0 голосов
/ 01 декабря 2013

DefaultModelBinder работает, если класс Model имеет конструктор по умолчанию, а свойства имеют get и set.Во всех остальных случаях это не работает.

Пример

public class Product
{
    public int id;
    public string name;
}

не работает.

public class Product
{
    public int id {get; set;}
    public string name {get; set;}

    public Product()
    {
    }
}

работает.

...