我有一个多步注册表单:
第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");
}
}
答案 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");
}
}