コントローラー内でメソッドを使用して検証を支援しようとしています (注:DataAnnotations
私の状況では使用できません)。しかし、ロジック/コードが間違っています。
ウィザードのステップを処理するために使用[Serializable]
しているため、コントローラーのアクションは [詳細] > [確認] > [送信] に移動します。myData
コントローラーのアクションは、ビュー モデル (以下)から取得されたコントローラーでシリアル化されたパラメーターを受け取ります。
検証方法:
private bool DetailsValidation()
{
bool validate = true;
if (String.IsNullOrEmpty(myData.FirstName))
{
AddModelError("FirstName", T("Please specify a First Name."));
validate = false;
}
if (!validate)
{
return false;
}
return ModelState.IsValid
}
コントローラーでの 3 つのアクションは次のとおりです ([詳細] > [確認] > [送信])。
public ActionResult Details(string nextButton)
{
if ((nextButton != null) && ModelState.IsValid)
return RedirectToAction("Confirm");
return View(myData);
}
public ActionResult Confirm(string backButton, string nextButton)
{
if (backButton != null)
return RedirectToAction("Details");
else if ((nextButton != null) && ModelState.IsValid)
{
// code to add to DB
return RedirectToAction("Submitted");
}
else
return View(myData);
}
public ActionResult Submitted()
{
// code to send e-mail
return View(myData);
}
DataAnnotations
以前は次のような属性を使用していましたが[Required]
、ModelState
チェックは問題なく実行されました。しかし、今はそれを使用できないため、メソッドDetailsValidation
. ただし、それをDetails
アクションに適用すると(またはを使用するか、確認アクションのHttpPost
前に配置すると):return
public ActionResult Details(string nextButton)
{
if (DetailsValidation())
{
if ((nextButton != null) && ModelState.IsValid)
return RedirectToAction("Confirm");
}
return View(myData);
}
上記のコードを使用すると、モデルの検証はページの読み込み時にすぐに開始されます (HttpPost
発生しない別の DetailsPOST アクションで使用した場合)。
ここで、 (ビューを返すHttpPost
単純なアクションと、 DetailsPOST というラベルの付いた別のアクション) を使用すると、2 つの新しい問題を作成することを除いて、この問題を回避できます。Get
Post
まず、送信を行って詳細ページをリロードしてテストを続けると、フォームに以前の入力が再入力されます。
次に、ラジオ ボタン リストを使用すると、実際に選択されたラジオ ボタンに設定されるのではなく、最後のラジオ ボタンに設定されます。変。
これを乗り越える方法についての考え。を機能させる方法がわかりませんDetailsValidation
(個別HttpPost
のアクションを使用せずに)。DetailsValidation
それ以外の場合、私が考えることができる唯一の他のことは、コードのようなスパゲッティを作成するコントローラー アクション内ですべてのチェックを行うことです。
ありがとう。
フォローアップの質問:
ModelState.IsValid
アクションから削除して、次のようなプライベート検証メソッドに置き換えるのが適切でしょうか:
public ActionResult Details(string nextButton)
{
if ((nextButton != null) && DetailsValidation())
return RedirectToAction("Confirm");
return View(myData);
}
の利点を失うModelState.IsValid
か、あるいは「ノーノー」のように感じます。
そうでなければ、これはうまくいくでしょうか:
public ActionResult Details(string nextButton)
{
if ((nextButton != null) && ModelState.IsValid)
if DetailsValidation()
return RedirectToAction("Confirm");
return View(myData);
}
しかし、それは正しくないようです。