c# - MVC3 将多个字段作为单个属性进行验证

标签 c# asp.net-mvc-3 validation

我正在尝试验证包含在两个字段中的电话号码。

第一个字段显示区号,另一个字段显示剩余的电话号码数字。

要求是:

  1. 它们都是必需的。
  2. 它们必须是数字。
  3. 区号字段最多只能包含 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/

相关文章:

c# - 在 asp .net 中返回上一页的超链接

c# - 默认 getdate() 始终在 SQL Server 中存储 AM 时间

c# - 登录用户在一段时间后注销

asp.net-mvc-3 - ASP.NET MVC 3 使用 DI 和存储库与 EF 实现工作单元

android - Android 4.2 未显示错误指示器(用于表单验证)?

c# - 通用类和 Type.GetType()

ASP.Net SQL 连接字符串配置

python - 验证电子邮件地址的域

asp.net-mvc - 如何将 Html.CheckBox(列表)与 IEnumerable<T> 一起使用并进行验证

c# - 如何只选择 LINQ 中日期最高的记录