“至少需要一个”情况的 MVC3 自定义验证属性

本文关键字:情况 MVC3 自定义 属性 验证 一个 | 更新日期: 2023-09-27 18:31:12

嗨,我已经找到了这个答案:MVC3 验证 - 需要组中的一个验证

这相当具体地用于检查组名并使用反射。

的例子可能更简单一些,我只是想知道是否有更简单的方法可以做到这一点。

我有以下内容:

public class TimeInMinutesViewModel {
    private const short MINUTES_OR_SECONDS_MULTIPLIER = 60;
    //public string Label { get; set; }
    [Range(0,24, ErrorMessage = "Hours should be from 0 to 24")]
    public short Hours { get; set; }
    [Range(0,59, ErrorMessage = "Minutes should be from 0 to 59")]
    public short Minutes { get; set; }
    /// <summary>
    /// 
    /// </summary>
    /// <returns></returns>
    public short TimeInMinutes() {
        // total minutes should not be negative
        if (Hours <= 0 && Minutes <= 0) {
            return 0;
        }
        // multiplier operater treats the right hand side as an int not a short int 
        // so I am casting the result to a short even though both properties are already short int
        return (short)((Hours * MINUTES_OR_SECONDS_MULTIPLIER) + (Minutes * MINUTES_OR_SECONDS_MULTIPLIER));
    }
}
我想向小时和分钟属性或

类本身添加一个验证属性......这个想法是确保这些属性中至少有 1 个(小时或分钟)具有值,服务器端和客户端使用自定义验证属性进行验证。

请问有人有这方面的例子吗?

谢谢

“至少需要一个”情况的 MVC3 自定义验证属性

查看 FluentValidation http://fluentvalidation.codeplex.com/或者您可以对要检查是否至少有一个属性具有值的每个 ViewModel 使用此小助手,或者根据需要进一步修改它。

public class OnePropertySpecifiedAttribute : ValidationAttribute
{       
    public override bool IsValid(object value)
    {            
         Type typeInfo = value.GetType();
         PropertyInfo[] propertyInfo = typeInfo.GetProperties();
         foreach (var property in propertyInfo)
         {
            if (null != property.GetValue(value, null))
            {                    
               return true;
            }
         }           
         return false;
    }
}

并将其应用于您的视图模型:

[OnePropertySpecified(ErrorMessage="Either Hours or Minutes must be specified.")]
public class TimeInMinutesViewModel 
{
  //your code
}

问候。

链接到的示例通过将属性应用于属性来定义组,这提供了很大的灵活性。 这种灵活性的成本是反射代码。 不太灵活的办法更容易实施,但适用范围更窄。

这是这种方法的 IsValid 方法;我将留给您来改编另一个示例的其余部分:

protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
{
    var viewModel = value as TimeInMinutesViewModel;
    if (viewModel == null)
    {
        //I don't know whether you need to handle this case, maybe just...
        return null;
    }
    if (viewModel.Hours != 0 || viewModel.Minutes != 0)
        return null;
    return new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); 
}