我试图找出验证一个页面签出的最佳方法。它包括:
Address类显然包含First Name
、Last Name
、Street1
、Street2
、City
、State
、Zip
、Phone
等。
假设用户在输入任何内容之前单击“OK”--那么您最终会出现十几个或更多的验证错误,这会给您带来一大块看起来很难看的红色文本。
我想验证地址作为一个单一的实体,并提供一个智能错误-如‘不完整的地址’,或更具体的错误,在适当的时候。但我仍然希望能够突出每个有问题的领域。我现在看不出这么简单的方法,因为很明显,Html.ValidationSummary
助手将显示每个字段。
因此,我想将摘要显示为:
"Your shipping address is incomplete"
并在红色Zip
和City
中突出显示。
我想我必须做一个完全定制的ValidationSummary,甚至是一个完全定制的数据结构。
做任何验证框架都可以使这样的总结更容易做,其中总结应该显示一个智能摘要,而不仅仅是每个单独的字段错误。
编辑: MVC 2 RC 现在支持模型级错误.
ValidationSummary现在支持只显示模型级错误的重载。如果您在每个表单字段旁边内联地显示验证消息,这是非常有用的。以前,这些消息将在验证摘要中重复。通过这些新的更改,您可以让摘要显示一个总体验证消息(例如。(“表单提交中有错误”)以及不适用于特定字段的验证消息列表。
有人拿到了如何做这件事的实际样本吗?
发布于 2009-12-29 05:37:26
您可以使用复合地址属性并将整个地址验证为一个单元:
public class Address
{
public string Street { get; set; }
public string City { get; set; }
public string Zip { get; set; }
}
public class Order
{
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
[AddressRequired("Your shipping address is incomplete")]
public Address ShipTo { get; set; }
[AddressRequired("Your billing address is incomplete")]
public Address BillTo { get; set; }
// you could do this if you still need 1:1 mapping for model binding
public string ShippingCity
{
get { return ShipTo.City; }
set { ShipTo.City = value; }
}
}
验证属性如下所示:
public class AddressRequiredAttribute : ValidationAttribute
{
...
public override bool IsValid(object value)
{
var address = value as Address;
if (address != null)
{
...
}
}
}
发布于 2009-11-29 15:10:33
IDataErrorInfo有两个成员:
如果您实现了Error成员,您将得到一条错误消息。
发布于 2009-11-29 15:30:04
在最近的一个项目中,我处理了一个类似的问题,我做了一个自定义验证摘要,下面是代码:
<%
if (!ViewData.ModelState.IsValid)
{
Response.Write("<div class=\"prepend-1 span-10 last notice\">");
Response.Write("<span>Please fix fields marked with an asteristk <span class=\"ss_sprite ss_asterisk_orange\"> </span></span>");
Response.Write("<ul>");
foreach (KeyValuePair<string, ModelState> keyValuePair in ViewData.ModelState)
{
foreach (ModelError modelError in keyValuePair.Value.Errors)
{
%>
<li><%= Html.Encode(modelError.ErrorMessage)%></li>
<%
}
} Response.Write("</ul>");
Response.Write("</div>");
}
%>
我是在一个部分视图中这样做的,但也许最好用Helper方法包装,就像原始的ValidationSummary一样。
在内部,您可以检查任何特殊和独特的要求。希望能帮上忙。
https://stackoverflow.com/questions/1815005
复制相似问题