我们有几种形式要求我们的会员提供个人信息。我们有一个用于个人信息的模型,并有一个使用该模型的局部视图。一些模型使用PersonalInfo模型作为子模型。
我希望局部视图能够使用正确的name属性呈现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()) {
Member Info
@Html.TextBoxFor(x => x.ShoeSize)
@{Html.RenderPartial("_PersonalInfo", Model.PersonalInfo);}
}
义工检视:
@model Volunteer
using (Html.BeginForm()) {
Volunteer Info
@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 .
// It will work if .
return View(model);
}
}
通过局部视图呈现的HTML代码:
如果我使用Html.TextBox,则不会获得客户端验证。
@Html.TextBox("PersonEditorModel.FirstName", Model.FirstName)
结果是:
您要使用TextBoxFor(没有局部变量,以便Model可以看到层次结构)或使用编辑器模板
戴夫-我相信我想使用局部函数,因此我不必在使用局部函数的所有形式中重复TextBoxFor(FirstName)和TextBoxFor(LastName)。 也许我不了解你...
你们一半了解我。 要进行分层绑定,您应该使用TextBoxFor(m => m.PersonEditorModel.FirstName或使用编辑器模板lostechies.com/jimmybogard/2011/09/07/
您应该使用EditorTemplates而不是局部视图。
您需要将_PersonalInfo.cshtml移至Views\Shared\EditorTemplates\PersonalInfo.cshtml并更改"志愿者视图":
@model Volunteer
using (Html.BeginForm()) {
Volunteer Info
@Html.TextBoxFor(x => x.HairColor)
@Html.EditorFor(x => x.PersonalInfo) @* << change *@
}
有关更多详细信息,请参阅Dave A提到的博客文章。 Scott Hanselman最近还有一篇文章介绍了EditorTemplates。