如何使用Html.TextBoxFor进行子模型 - 获取名称属性正确

时间:2013-03-29 19:17:09

标签: asp.net-mvc

我们有几种表格要求我们的会员提供个人信息。我们有一个用于个人信息的模型和一个使用该模型的部分视图。有几个模型使用PersonalInfo模型作为子模型。

我希望局部视图能够使用正确的name属性呈现html。为了正确绑定,FirstName输入标记的name属性应为“PersonalInfo.FirstName” - 而不是“FirstName”。

我想使用Html.TextBoxFor,因为它利用了数据注释和不显眼的验证。 Html.TextBox不实现数据注释的验证。

或者 - 也许有人可以告诉我为什么Html.TextBox不使用数据注释并创建客户端验证。

public class PersonalInfo {
    [Required(ErrorMessage = "First Name is required")]
    [StringLength(50, ErrorMessage = "First Name must be less than 50 letters")]
    public string FirstName {get; set;}
    public string LastName {get; set;}
}

public class MemberModel {
    public string ShoeSize {get; set;}
    public PersonalInfo PersonalInfo {get; set;}
}

public class VolunteerModel {
    public string HairColor {get;set;}
    public PersonalInfo PersonalInfo {get; set;}
}

会员观点:

@model Member
using (Html.BeginForm()) {
    <h1>Member Info</h1>
    @Html.TextBoxFor(x => x.ShoeSize)
    @{Html.RenderPartial("_PersonalInfo", Model.PersonalInfo);}
}

志愿者观点:

@model Volunteer
using (Html.BeginForm()) {
    <h1>Volunteer Info</h1>
    @Html.TextBoxFor(x => x.HairColor)
    @{Html.RenderPartial("_PersonalInfo", Model.PersonalInfo);}
}

个人信息的部分视图... _PersonalInfo.cshtml:

@model PersonalInfo
@Html.TextBoxFor(x => x.FirstName)
@Html.TextBoxFor(x => x.LastName)

控制器:

public class MemberController : Controller
{
    public ActionResult Index()
    {
        return View(new MemberModel());
    }
    [HttpPost]
    public ActionResult Index(MemberModel model)
    {
        // model.PersonalInfo.FirstName should be set from user input at this point.
        // It is not set correctly when <input name="FirstName">.
        // It will work if <input name="PersonalInfo.FirstName">.
        return View(model);
    }
}

部分视图呈现的Html代码:

<input class="basic-textbox focus" data-val="true" data-val-length="First Name must be less than 50 letters" data-val-length-max="50" data-val-required="First Name is required" id="FirstName" name="FirstName" type="text" value="Joseph" />

如果我使用Html.TextBox,我不会得到客户端验证。

@Html.TextBox("PersonEditorModel.FirstName", Model.FirstName)

结果:

<input id="PersonEditorModel_FirstName" name="PersonEditorModel.FirstName" type="text" value="Joseph" />

1 个答案:

答案 0 :(得分:1)

您应该使用EditorTemplates而不是部分视图。

您需要将_PersonalInfo.cshtml移至Views\Shared\EditorTemplates\PersonalInfo.cshtml并更改志愿者视图:

@model Volunteer
using (Html.BeginForm()) {
    <h1>Volunteer Info</h1>
    @Html.TextBoxFor(x => x.HairColor)
    @Html.EditorFor(x => x.PersonalInfo) @* << change *@
}

有关详细信息,请参阅the blogpost mentioned by Dave A。 Scott Hanselman还有一个recent article显示了EditorTemplates。