我正在开发Sitecore / MVC应用程序,这是我的第一个MVC应用程序,因此我正在学习。毫无疑问,我在某个地方出错了。
我有一个篮子,上面有2个地址视图,一个用于计费,另一个用于交付。还有一个“交付与账单相同”的复选框,允许用户只填写一个地址。当您用户选中此复选框时,传递地址div将折叠。
主要观点:
<div class="pure-control-group">
<h2>Billing Address</h2>
@Html.Action("Init", "Address", new {AddressType = "Billing", @Address = Model.Billing})
</div>
<!-- Delivery Address-->
<div class="pure-control-group">
<h2>Delivery Address</h2>
<label for="UseBillingForShipping" class="pure-checkbox">
@Html.CheckBoxFor(x => x.UseBillingForShipping)
Same as Billing Address above
</label>
</div>
<div class="manual-address-entry focus-pane">
@Html.Action("Init", "Address", new {AddressType = "Delivery", @Address = Model.Delivery})
</div>
地址视图的一个示例:
<div class="pure-u-1 pure-u-sm-1-2 pure-u-lg-2-5">
<label for="@(Model.AddressType).FirstName">First Name<span class="required">*</span></label>
<input type="text" id="@(Model.AddressType).FirstName" name="@(Model.AddressType).FirstName">
@Html.ValidationMessageFor(x=>x.FirstName) //<= How to handle this?
</div>
<div class="pure-u-1 pure-u-sm-1-2 pure-u-lg-2-5">
<label for="@(Model.AddressType).LastName">Last Name<span class="required">*</span></label>
<input type="text" id="@(Model.AddressType).LastName" name="@(Model.AddressType).LastName">
@Html.ValidationMessageFor(x=>x.LastName) //<= How to handle this?
</div>
当我尝试验证时,我的问题就出现了。地址视图上控件的ID名为id="@(Model.AddressType).LastName"
,因此对于结算地址,它们会呈现为id="Billing.LastName"
在地址模型上,字段被注释,例如:
[Required(ErrorMessage = "First Name is required")]
public string FirstName { get; set; }
[Required(ErrorMessage = "Last Name is required")]
public string LastName { get; set; }
所以我有两个问题:
@Html.ValidationMessageFor
标记。我尝试了@Html.ValidationMessageFor(x=>x.FirstName)
和类似于labelfor
(<label for="@(Model.AddressType).LastName">
),@Html.ValidationMessageFor(@(Model.AddressType).LastName)
的内容,但都没有效果。我开始认为我完全走错了路。答案 0 :(得分:1)
处理此问题的最简单方法是为您的地址模型使用自定义EditorTemplate
。假设其public class Address
,则在名为/Views/Shared/EditorTemplates
的{{1}}中创建一个视图(即命名以匹配您的类型名称)
Address.cshtml
然后在主视图中
@model yourAssembly.Address
@Html.LabelFor(m => m.FirstName)
@Html.TextBoxFor(m => m.FirstName)
@Html.ValidationMessageFor(m => m.FirstName)
... // ditto for other properties of Address
@Html.EditorFor(m => m.Billing)
@Html.CheckBoxFor(x => x.UseBillingForShipping)
@Html.EditorFor(m => m.Delivery)
方法将使用您的模板并正确命名所有绑定元素(包括验证消息)
请注意,由于您拥有EditorFor()
属性,因此该脚本会隐藏&#39;交付&#39;地址,还应确保复制“结算”的内容。到了交付&#39;地址控制否则验证将失败(或者您可以使用[Required]
验证属性)