子视图上的MVC验证

时间:2015-06-08 07:19:54

标签: asp.net-mvc-5

我正在开发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; }

所以我有两个问题:

  1. 如何创建@Html.ValidationMessageFor标记。我尝试了@Html.ValidationMessageFor(x=>x.FirstName)和类似于labelfor<label for="@(Model.AddressType).LastName">),@Html.ValidationMessageFor(@(Model.AddressType).LastName)的内容,但都没有效果。我开始认为我完全走错了路。
  2. 第二个是如果用户选择相同地址的复选框,我将如何仅关闭第二个地址的验证。

1 个答案:

答案 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]验证属性)