验证属性MVC 2 - 检查两个值中的一个

时间:2010-07-21 10:01:54

标签: validation asp.net-mvc-2 attributes viewmodel

有人可以帮我解决这个问题。我正在试图弄清楚如何检查表单上的两个值,必须填写两个项目中的一个。如何检查以确保输入了一个或两个项目?

我在ASP.NET MVC 2中使用了viewmodels。

这里有一小段代码:

观点:

Email: <%=Html.TextBoxFor(x => x.Email)%>
Telephone: <%=Html.TextBoxFor(x => x.TelephoneNumber)%>

视图模型:

    [Email(ErrorMessage = "Please Enter a Valid Email Address")]
    public string Email { get; set; }

    [DisplayName("Telephone Number")]
    public string TelephoneNumber { get; set; }

我希望提供这些细节。

感谢您的任何指示。

1 个答案:

答案 0 :(得分:5)

您可以使用与PropertiesMustMatch属性相同的方式执行此操作,该属性是File-&gt; New-&gt; ASP.NET MVC 2 Web应用程序的一部分。

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public sealed class EitherOrAttribute : ValidationAttribute
{
    private const string _defaultErrorMessage = "Either '{0}' or '{1}' must have a value.";
    private readonly object _typeId = new object();

    public EitherOrAttribute(string primaryProperty, string secondaryProperty)
        : base(_defaultErrorMessage)
    {
        PrimaryProperty = primaryProperty;
        SecondaryProperty = secondaryProperty;
    }

    public string PrimaryProperty { get; private set; }
    public string SecondaryProperty { get; private set; }

    public override object TypeId
    {
        get
        {
            return _typeId;
        }
    }

    public override string FormatErrorMessage(string name)
    {
        return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString,
            PrimaryProperty, SecondaryProperty);
    }

    public override bool IsValid(object value)
    {
        PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value);
        object primaryValue = properties.Find(PrimaryProperty, true /* ignoreCase */).GetValue(value);
        object secondaryValue = properties.Find(SecondaryProperty, true /* ignoreCase */).GetValue(value);
        return primaryValue != null || secondaryValue != null;
    }
}

此函数的关键部分是IsValid函数,用于确定两个参数中的一个是否具有值。

与普通的基于属性的属性不同,它适用于类级别,可以这样使用:

[EitherOr("Email", "TelephoneNumber")]
public class ExampleViewModel
{
    [Email(ErrorMessage = "Please Enter a Valid Email Address")]
    public string Email { get; set; }

    [DisplayName("Telephone Number")]
    public string TelephoneNumber { get; set; }
}

您应该能够根据需要为每个表单添加尽可能多的内容,但如果您想强制他们在两个以上的框中输入一个值(例如电子邮件,电话或传真),那么您可以可能最好将输入更改为更多的值数组并以这种方式解析它。