1

我有一个多步骤注册表单:

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

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

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

如果我将所需属性应用于第 2 页模型的名称字段,则第 1 页 -> 第 2 页调用将始终失败。所以我取出了所需的属性并为第 3 页创建了一个重复的视图模型,与第 2 页相同,但名称上有所需的属性。现在第 3 页可以检测名称是否为空且模型无效,因此此时我重定向回第 2 页,但第 2 页上的视图不会显示名称字段周围的验证错误。

我能做些什么 ?

视图模型代码:

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. 获取步骤1
  2. POST step1(检查ModelState.IsValid是否不返回View
  3. 重定向到步骤 2
  4. 获取步骤 2 5 ...

有道理?

当然,数据应该在步骤之间保存。您可以在客户端(cookie、sesvars、本地存储...)或服务器端(会话、一些持久性)执行此操作。但是我建议您只使用 ASP.NET 会话。

于 2013-03-10T10:23:22.583 回答