我们有几种表格要求我们的会员提供个人信息。我们有一个用于个人信息的模型和一个使用该模型的部分视图。有几个模型使用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" />
答案 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。