1

複数ステップの登録フォームがあります。

ページ 1 (メール) -> ページ 2 (名前) -> ページ 3 (成功)

私のページ 1 では、クエリ文字列を介して電子メール フィールドに事前入力できます。

問題は 2 ページにあります 名前フィールドが空で送信された場合、検証エラーを表示できません。

ページ 2 モデルの名前フィールドに必須属性を適用すると、ページ 1 -> ページ 2 の呼び出しは常に失敗します。そのため、必要な属性を取り出して、ページ 2 と同じですが、名前に必要な属性を付けて、ページ 3 の複製ビュー モデルを作成しました。ページ 3 は、名前が空でモデルが無効かどうかを検出できるため、この時点でページ 2 にリダイレクトされますが、ページ 2 のビューでは、名前フィールドの周りに検証エラーが表示されません。

私に何ができる ?

ViewModel コード:

public Class StepOneViewModel
{
    [Required]
    public string Email{ get; set; }
}


public Class StepTwoViewModel
{
    [Required]
    public string Email{ get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }
}

public Class StepTwoViewModelPOST
{
    [Required]
    public string Email{ get; set; }

    [Required]
    [Display(Name = "First Name")]
    public string FirstName { get; set; }

    [Required]
    [Display(Name = "Last Name")]
    public string LastName { get; set; }
}

コントローラーコード:

        public ActionResult Step1(string email)
        {
           return View();
        }

        [HttpPost]
        public ActionResult Step1(StepOneViewModel viewModel)
        {
            if (!ModelState.IsValid)
                return View();
            else
                return RedirectToAction("Step2", viewModel);
        }

        public ActionResult Step2(StepTwoViewModel viewModel)
        {
            if (!ModelState.IsValid)
                return RedirectToAction("Step1", viewModel);
            else
            {
                return View(viewModel);
            }
        }


        [HttpPost]
        public ActionResult Step2(StepTwoViewModelPOST viewModel)
        {
            if (!ModelState.IsValid)
                return RedirectToAction("Step1", viewModel);
            else
            {
                return Content("Success");
            }
        }
4

2 に答える 2

0

わかりました... Step2 の POST ハンドラーで、ModeState が有効でない場合は、StepTwoViewModelPOST => StepTwoViewModel をマップし、View をモデルと共に返すだけです。

  [HttpPost]
    public ActionResult Step2(StepTwoViewModelPOST viewModel)
    {
        if (!ModelState.IsValid)
        {
             StepTwoViewModel model = new StepTwoViewModel { 
                  Email = viewModel.Email,
                  FirstName = viewModel.FirstName,
                  LastName = viewModel.LastName
              };
            return View(model);
        }
        else
        {
            return Content("Success");
        }
    }
于 2013-03-10T05:33:21.963 に答える
-1

ここに「ワークフロー」の問題があります。やれよPRG!

PRGとは?投稿/リダイレクト/取得。したがって、次のフォームワークフローを試してください。

  1. GET step1
  2. POST step1 (ModelState.IsValidリターンになっていないかチェックView)
  3. ステップ 2 にリダイレクト
  4. GET step2 5 ...

わかる?

もちろん、データはステップ間で保存する必要があります。クライアント側(Cookie、sesvars、ローカルストレージなど)またはサーバー側(セッション、永続性)で実行できます。ただし、ASP.NET セッションのみを使用することをお勧めします。

于 2013-03-10T10:23:22.583 に答える