MVC3正在将多个字段验证为单个属性
本文关键字:验证 单个 属性 字段 MVC3 | 更新日期: 2023-09-27 18:13:29
我正在尝试验证包含在两个字段中的电话号码。
第一个字段显示区号,另一个字段显示剩余的电话号码数字。
要求是:
- 它们都是必需的
- 它们必须是数字
- 区号字段最多只能是6位数字,电话号码字段最多不能是10位数字
两个字段都需要显示一条消息。例如,如果区号丢失,但提供了电话号码,则应在两个字段后显示一条消息,说明"请输入电话号码。">。
我目前拥有的型号类似于:
public class Customer
{
//...other fields here
public string AreaCode { get; set; }
public string PhoneNumber { get; set; }
}
我无法将电话实现为带有正则表达式或simlar的单个字段。
这里有一个类似的问题(也有点类似(,答案建议创建一个自定义验证属性(在本例中命名为MultiFieldRequired
(,以指定属性中所需字段的名称。验证属性然后使用反射来检查其他属性的值,以报告是否存在错误。
例如,在上述模型的情况下,我认为我应该具有:
public class Customer
{
//...other fields here
public string AreaCode { get; set; }
[MultiFieldRequired("AreaCode", "PhoneNumber", ErrorMessage="Please enter a phone number")]
public string PhoneNumber { get; set; }
}
然而,我在提供的解决方案中遇到了一个小问题。自定义验证属性返回的错误仅针对具有数据注释的字段报告(PhoneNumber是上面的模型(。因此,如果用户没有输入区域代码,但提供了电话号码,则会根据电话号码字段而不是区域代码报告错误。此外,如果您使用的是visual studio Internet项目提供的css,则提供的PhoneNumber字段将显示为红色,而无效的区号显示为白色(没有显示错误(,因此这看起来有点奇怪。
有没有人有办法纠正这种着色行为,或者如果任何一个字段出现错误,我可以报告错误消息(在字段上使用正确的着色(?
提前谢谢。
在两者上应用属性,并且只有一个ValidationMessageFor(任何人(,并将其放置在您想要显示消息的位置(从帖子来看,您似乎只想要一条错误消息(。
public class Customer
{
//...other fields here
[MultiFieldRequired("AreaCode", "PhoneNumber", ErrorMessage="Please enter a phone number")]
public string AreaCode { get; set; }
[MultiFieldRequired("AreaCode", "PhoneNumber", ErrorMessage="Please enter a phone number")]
public string PhoneNumber { get; set; }
}
查看
<div class="editor-label">
@Html.LabelFor(model => model.AreaCode)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.AreaCode)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.PhoneNumber)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PhoneNumber)
@Html.ValidationMessageFor(model => model.PhoneNumber)
</div>
[MultiFieldRequired("AreaCode", "PhoneNumber", ErrorMessage="Please enter a phone number")]
public class Customer
{
//...other fields here
public string AreaCode { get; set; }
public string PhoneNumber { get; set; }
}
所需的Multi-字段需要放在类上,而不是单个属性。如果您查看实现,它就是查看传入的对象,并对其属性进行迭代。