使用MVC在同一页面上进行部分视图和模型绑定的多个实例

时间:2016-03-18 14:51:14

标签: c# regex asp.net-mvc asp.net-mvc-4 razor

我对视图有两次偏见。部分不使用循环并进行基本验证。

以下是部分视图代码:

 <div class="col-md-4">
                    @Html.LabelFor(model => model.ZipCode, new { @class = "control-label " })
                    @Html.TextBoxFor(model => model.ZipCode, new { @class = "form-control ",  tabindex = "4" })
                    @Html.ValidationMessageFor(model => model.ZipCode)
                </div>

以下是我的主视图两次调用它:

<div id="homeaddress">
                                @if (Model == null)
                                {
                                @Html.Partial("~/Views/AddrPartial.cshtml", new Address())
                            }
                            else
                            {
                                @Html.Partial("~/Views/AddrPartial.cshtml", Model.HomeAddress)
                            }
                        </div>

<div id="mailingaddress">
                                @if (Model == null)
                                {
                                    @Html.Partial("~/Views/AddrPartial.cshtml", new Address())
                                }
                                else
                                {
                                    @Html.Partial("~/Views/AddrPartial.cshtml", Model.MailingAddress)
                                }
                            </div>

然后只有“homeadrress”div验证工作......这就是我的模型的设置方式:

    public class Information
   {
    public Address HomeAddress { get; set; }
    public Address MailingAddress { get; set; }
    }

然后有一个单独的Address类......

public class Address
{
        [Display(Name = "Address")]
        public string Addr1 { get; set; }
        [Display(Name = "Address 2")]
        public string Addr2 { get; set; }
        [Display(Name = "Zip Code")]
        [RegularExpression(@"^\d{5}(-\d{4})?|^$", ErrorMessage = "Invalid Zip Code")]
        public string ZipCode { get; set; }

}

生成的html显示问题... mailingaddress html没有检查验证所需的正则表达式。

<input class="form-control " data-val="true" data-val-regex="Invalid Zip Code" data-val-regex-pattern="^\d{5}(-\d{4})?|^$" id="ZipCode_home" name="ZipCode_home"  tabindex="4" type="text" value="12345">
<span class="field-validation-valid" data-valmsg-for="ZipCode_home" data-valmsg-replace="true"></span>

<input class="form-control " id="ZipCode_mailing" name="ZipCode_mailing"  tabindex="4" type="text" value="54321">
<span class="field-validation-valid" data-valmsg-for="ZipCode_mailing" data-valmsg-replace="true"></span>

在查看此代码后,我的问题是为什么会发生这种情况,我该如何解决这个问题。在此先感谢我可以回答问题,并在需要时提供更多代码。

2 个答案:

答案 0 :(得分:3)

那是因为您正在渲染地址部分页面的两个实例。模型绑定框架要求HTML字段遵循此命名约定,以使模型绑定按预期工作

<input id="ShippingAddress_Street1" 
   name="ShippingAddress.Street1" type="text" value="" />
<input id="BillingAddress_Street1" 
   name="BillingAddress.Street1" type="text" value="" />

从上面的标记中可以看出,id和name属性必须完全符合绑定的模型属性。

通过在渲染地址部分页面时使用Partial()助手的变体,可以解决上述问题

Html.Partial("_Address", 
new ViewDataDictionary() 
{ 
     TemplateInfo = new TemplateInfo() 
      { HtmlFieldPrefix = "ShippingAddress" } })

<h3>Billing Address</h3>
@Html.Partial("_Address", 
new ViewDataDictionary() 
{ 
    TemplateInfo = new TemplateInfo() 
       { HtmlFieldPrefix = "BillingAddress" } })

答案 1 :(得分:0)

出于某种原因,上面的代码对我没有用,所以我最终写成如下:

@Html.Partial("_Address",
                 Model?.Form?.BillingAddress,
                 new ViewDataDictionary(ViewContext.ViewData)
                 {
                     TemplateInfo = { 
                                      HtmlFieldPrefix = "billing",
                                      FormattedModelValue = "Billing address" 
                                    }
                 })

我使用FormattedModelValue来存储标签,因为相同的视图用于生成公司地址和帐单邮寄地址。

希望有所帮助