当模型包含模型时,默认模型绑定不起作用

时间:2011-12-21 21:24:03

标签: asp.net-mvc-3 model-binding

这是我的模特。

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 个答案:

答案 0 :(得分:1)

DefaultModelBinder类在内部使用Activator.CreateInstance(typeToCreate)来创建模型类。您的NameModel类没有默认构造函数,因此DefaultModelBinder无法实例化它。因此,如果添加默认构造函数,它应该可以工作。

EDIT 它将不起作用您需要使用EditorTemplate的部分视图:
在您的视图文件夹下创建一个名为EditorTemplates的文件夹,并将您的ShowName.cshtml添加到主视图中使用:

@using(Html.BeginForm())
{
    @Html.EditorFor(m => m.Name, "ShowName")
    ...

答案 1 :(得分:-1)

如果Model类具有默认构造函数且属性已获取并设置,则DefaultModelBinder有效。在所有其他情况下,它不起作用。

实施例

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

不起作用。

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

    public Product()
    {
    }
}

作品。