仅在表单POST上的View中显示ModelState错误

时间:2013-03-10 00:37:04

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-2 asp.net-mvc-4

我有一个多步注册表单:

第1页(电子邮件) - >第2页(姓名) - >第3页(成功)

在我的第1页上,可以通过查询字符串预先填充电子邮件字段。

问题出在第2页。如果名称字段为空并且已提交,则无法显示验证错误。

如果我将所需属性应用于页面2模型的名称字段,那么页面1 - >第2页的电话总是会失败。所以我拿出了必需的属性并为第3页创建了一个重复的视图模型,与第2页相同,但名称上包含必需的属性。现在,第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");
            }
        }

1 个答案:

答案 0 :(得分: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");
        }
    }