又一个模型约束问题

时间:2011-12-22 14:20:36

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

我昨天here稍微修改了一个类似的问题。

以下是我的模特

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

public class NameModel
{
    public string Title     { get; set; }
    public string FirstName { get; set; }
    public string LastName  { get; set; }
    public List<SelectListItem> Titles 
    {
        get
        {
            var list = new List<SelectListItem>();
            list.Add(new SelectListItem() { Text = "Mr.", Value = "Mr." });
            list.Add(new SelectListItem() { Text = "Mrs.", Value = "Mrs." });
            list.Add(new SelectListItem() { Text = "Ms.", Value = "Ms." });

            return list;
        }
    }

    public NameModel()
    {

    }

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

然后我的第一个视图ShowName.cshtml如下

@model MyTestApp.Models.NameModel

@Html.DropDownListFor(m => m.Title, Model.Titles, Model.Titles)
<br />
@Html.LabelFor( m => m.LastName) 
@Html.TextBoxFor( m => m.LastName)       
<br />
@Html.LabelFor( m => m.FirstName) 
@Html.TextBoxFor( m => m.FirstName)       

以上视图用于ShowInfo.cshtml,如下所示

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

问题是手机很好,但名称为空。如果我将@Html.Partial("ShowName", Model.Name)的通话更改为@Html.EditorFor(m => m.Name, "ShowName") 然后标题的下拉列表显示为编辑框

1 个答案:

答案 0 :(得分:2)

我建议您使用编辑器模板。因此,而不是Html.Partial使用:

@Html.EditorFor(x => x.Name, "ShowName")

然后将部分移动到~/Views/Shared/EditorTemplates/ShowName.cshtml

这就是部分不起作用的原因:它为输入字段生成错误的名称。所以当你写:

@Html.TextBoxFor(m => m.LastName)

这将生成以下标记:

<input type="text" name="LastName" id="LastName" value="" />

而你需要:

<input type="text" name="Name.LastName" id="Name_LastName" value="" />

使默认模型绑定器正常工作,并在主视图模型上指定Name属性的LastName属性。

当您使用编辑器模板时,如我的示例所示,它们会自动处理关联路径并为输入元素生成专有名称。