我正在尝试验证包含在两个字段中的电话号码。
第一个字段显示区号,另一个字段显示剩余的电话号码数字。
要求是:
- 它们都是必需的。
- 它们必须是数字。
- 区号字段最多只能包含 6 位数字,电话号码字段最多只能包含 10 位数字。
需要为两个字段显示一条消息。例如,如果缺少区号但提供了电话号码,则应在两个字段后显示一条消息,说明 “请输入电话号码。”。
我目前的模型类似于:
public class Customer
{
//...other fields here
public string AreaCode { get; set; }
public string PhoneNumber { get; set; }
}
我无法将电话作为具有正则表达式或类似表达式的单个字段来实现。
有一个类似的问题here (也有点类似于 here )答案建议创建自定义验证属性(在本例中名为 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 是上面的模型)。因此,如果用户未输入 AreaCode 但提供了 PhoneNumber,则针对 PhoneNumber 字段而不是 AreaCode 报告错误。此外,如果您使用的是随 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>
关于c# - MVC3 将多个字段作为单个属性进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8013172/