这是我的模特。
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)
{
...
}
问题是当我检查模型的值时,手机很好,但名称为空。任何想法如何使它工作?
答案 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()
{
}
}
作品。