0

コントローラー内でメソッドを使用して検証を支援しようとしています (注: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 つの新しい問題を作成することを除いて、この問題を回避できます。GetPost

まず、送信を行って詳細ページをリロードしてテストを続けると、フォームに以前の入力が再入力されます。

次に、ラジオ ボタン リストを使用すると、実際に選択されたラジオ ボタンに設定されるのではなく、最後のラジオ ボタンに設定されます。変。

これを乗り越える方法についての考え。を機能させる方法がわかりません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);
}

しかし、それは正しくないようです。

4

1 に答える 1