1

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

我希望局部视图能够使用正确的名称属性呈现 html。为了正确绑定,FirstName 输入标记的名称属性应该是“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" />
4

1 回答 1

1

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

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

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

有关更多详细信息,请参阅Dave A 提到的博文。Scott Hanselman最近还发表了一篇文章,展示了 EditorTemplates。

于 2013-03-29T20:26:01.067 回答