質問

境界モデルを検証するカスタムモデルバインダーを作成したいと思います。私はこれのいくつかの例を見つけました、そしてそれはそれが本来のように機能します。しかし、モデルにエラーがある場合、ユーザーを彼から来たページに送り返すことができるようにしたいと思います。

これは可能ですか、これを行うことで明らかな副作用はありますか?

私が達成したいのは、コントローラーが常に有効なコマンドを取得するため、アクションメソッドでmodel.isvalid()を確認する必要はないということです。

役に立ちましたか?

解決

あなたがやろうとしていることはよさそうだが、うまくいきない。制限が多すぎます。

  1. 通常、コントローラーのみがエラーの場合にリダイレクトする場所を決定できます。 [Onerror( "Action")]のような追加の属性を使用できますが、これは回避策のように見えます。
  2. フォームは投稿しません すべて データ。たとえば、ドロップダウンリスト、補助値はコントローラーで入力する必要があります。おそらくこれにアクションフィルターを使用できますが、これは再びハックのように見えます。

モデルエラー(バインダーセット)とリダイレクト(セットアップ.result)をチェックするグローバルアクションフィルター(ベースコントローラー上)をセットアップできます。しかし、これは複雑であり、余分な「コード」 - 属性などが必要であるため、実際のアプリケーションロジックを追跡して関連することは困難です。また、エラーリダイレクトなどに単純なアクション名だけではない場合、すぐに制限が強くなりすぎます(漏れやすい抽象化の法則を参照)。

これは見えます 多くの このように行われた場合、よりシンプル:

public ActionResult PostAction(ViewModel data)
{
   if (!ModelState.IsValid)
      return View("GetAction", data.WithDropDownList(repository.GetProducts()));

}

上記の例では、コントローラーはワークフローを制御する必要があります。また、追加の検証/セットアップを実行する自由もあります。モデルステートエラーなどを提供するモデルバインダーなど、できるだけ多くのインフラストラクチャを使用できますが、コントローラーのみが入力と出力に最終決定を下す必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top