我对视图有两次偏见。部分不使用循环并进行基本验证。
以下是部分视图代码:
<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>
在查看此代码后,我的问题是为什么会发生这种情况,我该如何解决这个问题。在此先感谢我可以回答问题,并在需要时提供更多代码。
答案 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
来存储标签,因为相同的视图用于生成公司地址和帐单邮寄地址。
希望有所帮助