1

こんにちは、私はすでにこの回答を見つけました: MVC3 Validation - Require One From Group

これは、グループ名のチェックにかなり固有であり、リフレクションを使用します。

私の例はおそらくもう少し単純で、もっと簡単な方法があるかどうか疑問に思っていました.

私は以下を持っています:

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));
    }
}

Hours & Minutes プロパティまたはクラス自体に検証属性を追加したいのですが、これらのプロパティ (Hours OR minutes) の少なくとも 1 つに、カスタム検証属性。

誰かがこれの例を持っていますか?

ありがとう

4

2 に答える 2

5

FluentValidation http://fluentvalidation.codeplex.com/を確認するか、少なくとも 1 つのプロパティに値があるかどうかを確認するすべての 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;
    }
}

ViewModel に適用します。

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

よろしく。

于 2012-04-14T17:41:05.737 に答える
2

リンクした例では、プロパティに属性を適用することでグループを定義しています。これにより、柔軟性が大幅に向上します。その柔軟性の代償はリフレクションコードです。柔軟性の低いアプローチは実装が簡単ですが、適用範囲は狭くなります。

このようなアプローチの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)); 
} 
于 2012-04-14T17:25:17.223 に答える