2011-12-21 82 views
1

这是我的模型。当模型包含模型时,默认模型绑定不起作用

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) 
{ 
    ... 
} 

问题是,当我检查模型的值,电话很好,但名称为空。任何想法如何使其工作?

回答

1

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

编辑 这是行不通的局部视图,你需要使用一个EditorTemplate代替:
名为EditorTemplates视图文件夹下创建一个文件夹,把你的ShowName.cshtml那里添加在您的主视图中使用:

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

添加默认构造函数不能解决这个问题 – 2011-12-21 21:36:21

+0

我已经更新了我的答案,您仍然需要默认构造函数:) – nemesv 2011-12-21 21:55:51

+0

所以我不能在这里使用局部视图并且必须使用EditorFor?你能否详细说明一下? – 2011-12-21 22:01:39

-1

如果Model类具有默认构造函数并且属性具有get和set,则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() 
    { 
    } 
} 

的作品。