我正在尝试验证包含在两个字段中的电话号码。
第一个字段显示区号,另一个字段显示剩余的电话号码数字。
要求是:
两个字段都需要显示一条消息。例如,如果区域代码丢失但提供了电话号码,那么在两个字段显示“请输入电话号码”后,应显示一条消息。。
我目前的模型类似于:
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字段将显示为红色,而无效区域代码显示为白色(未显示错误),因此这看起来有点奇怪。
有没有人有办法纠正这种着色行为,或者如果任何一个字段出错,我可以报告错误消息(使用字段上的正确着色)?
提前谢谢。
答案 0 :(得分:3)
在两者上应用该属性并且只有一个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>
答案 1 :(得分:1)
[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字段放在类上,而不是单个属性。如果你看一下实现,它会查看传入的对象,并迭代它的属性。