3

私は次のような単純なモデルを持っています:

[Validator(typeof(EntryModelValidator))]
public class EntryModel : BaseNopEntityModel
{
  public virtual string ProductActionValue { get; set; }
}

モデルの保存を検証するために FluentValidation を使用しています。問題は、ユーザーがフォームに値を保存するときに、特定の状況で ProductActionValue を int として保存する必要があることです (もちろん常に文字列として保存されますが、int として解析可能である必要があります)。

値が空でないことを保証する次の検証ルールがあります。

 RuleFor(x => x.ProductCriteriaValue)
            .NotEmpty()
            .WithMessage(localizationService.GetResource("Common.FieldRequired"));

次のルールを追加して、int として検証しようとしました。

 RuleFor(x => Int32.Parse(x.ProductCriteriaValue))
            .GreaterThanOrEqualTo(1)
            .When(x => (ProductCriteriaTypes)x.ProductCriteriaTypeId == ProductCriteriaTypes.ProductCreatedGreaterThanXDays || (ProductCriteriaTypes)x.ProductCriteriaTypeId == ProductCriteriaTypes.ProductCreatedLessThanXDays)
            .WithMessage(localizationService.GetResource("Common.FieldRequired"));

しかし、これは FluentValidation ランタイム エラーをスローするだけです。とにかくこれを達成することはありますか?

前もってありがとうアル

AHMAD のソリューションを反映するように更新:

   {
        RuleFor(x => x.ProductCriteriaValue)
            .Must(BeANumber)
            .WithMessage(localizationService.GetResource("Common.FieldRequired"));
   }

    private bool BeANumber(string value)
    {
        int result;
        if (Int32.TryParse(value, out result))
        {
            return result >= 1;
        }
        return false;
    }
4

2 に答える 2

1

Predicate Validator (別名 Must)を使用できます。

RuleFor(x => x.ProductCriteriaValue)
    .Must(x => Int32.Parse(x.ProductCriteriaValue) >= 1)
    .When(x => (ProductCriteriaTypes)x.ProductCriteriaTypeId == ProductCriteriaTypes.ProductCreatedGreaterThanXDays || (ProductCriteriaTypes)x.ProductCriteriaTypeId == ProductCriteriaTypes.ProductCreatedLessThanXDays)
    .WithMessage(localizationService.GetResource("Common.FieldRequired"));

もちろん、これは解析が失敗しないことを前提としています。ProductCriteriaValue常に数値であり、うまく解析されますか? もしそうなら、これは大丈夫です。Int32.TryParseそれ以外の場合は、次のように述語を使用および変更して、これをより適切に確認することをお勧めします。

    .Must(x =>
    {
        int result;
        if (Int32.TryParse(x.ProductCriteriaValue, out result))
        {
            return result >= 1;
        }
        return false;
    })
于 2012-12-20T15:08:33.120 に答える
0

同じビューモデルに対して個別のバリデータークラスを使用する同様の質問にここで答えました。さらに、検証規則の重複を避けるために、2 つのバリデータ クラスの基本クラスを使用して共通の規則を含めることができることに注意してください。

于 2012-12-23T16:56:21.567 に答える