0

値が 0 の選択リストを検証するにはどうすればよいですか?

私は次のことを試しました

RuleFor(x => x.ProductId).Equal(0).WithMessage(required);
RuleFor(x => x.ProductId).NotEqual(0).WithMessage(required);
RuleFor(x => x.ProductId).GreaterThan(0).WithMessage(required);
RuleFor(x => x.ProductId).GreaterThan(0).When(x => x.ProductId < 1).WithMessage(required);
//etc.

選択リストの「選択...」の値が「0」です。フォームでその値を選択すると、ModelState.IsValid がエラーをスローするか (「予期しない範囲」)、ModelState.IsValid をコメントアウトすると、値 0 がデータベースに投稿されます。いずれにせよ、検証は行われていません。文字列、int、およびブール値が混在する他のすべてのフィールドは正常に機能し、正しく検証されます。

注: 私のモデルとビュー モデルでは ProductId は int です。

失った..

4

1 に答える 1

1

問題を解決しました。これは、私が決して尋ねたくなかった質問です。解決策は間違いの連続でしたが、途中で発見したことを共有します。

簡単な答えは次のとおりです。

RuleFor(x => x.ProductId).GreaterThan(0).WithMessage(required);

問題は私のコントローラーと(かなり恥ずかしい)私のビューにありました。

  1. ProductId の検証メッセージを追加するのを忘れていました。しかし、これで問題が完全に解決したわけではありません。
  2. 私のコントローラーはこんな感じでした。

[HttpPost]
public ActionResult Update(ProductModel model)
{
  if(!ModelState.IsValid)
      throw new ArgumentExpection();
//etc.
}

私はもともとモデルを Automapper で動作するようにテストしていましたが、検証を実装した後、ArgumentException を削除するのを忘れていました。

これが何をしたかというと、私の検証ルールが日の目を見ることはありませんでした。もちろん、コントローラーは実際の検証エラーをポストバックする代わりに、ModelState に関するエラーをスローするように指示されたため、検証されませんでした。ああ!

[HttpPost]
public ActionResult Update(ProductModel model)
{
  if(!ModelState.IsValid)
     return View(model);//pssst! the validation error is in here.
//etc.
}

物事の順序をよりよく理解できるようになりました。これが私のように愚かな他の誰かに役立つことを願っています。

于 2011-08-25T18:51:33.727 に答える