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