我有一个我正在ASP MVC中工作的表单,我想在页面之间保留数据(显然)。
目前,我正在使用包含整个表单中所有字段的大视图模型。然后我对表单的每一步都有一个动作:
// STEP ONE
public ActionResult Step1(MyViewModel model)
{
return View("Step1", model);
}
// STEP TWO
public ActionResult Step2(MyViewModel model)
{
return View("Step2", model);
}
// STEP THREE
public ActionResult Step3(MyViewModel model)
{
return View("Step3", model);
}
// STEP FOUR
public ActionResult Step4(MyViewModel model)
{
return View("Step4", model);
}
每个页面上的每个表单都将操作设置为下一步,因此Step1.cshtml包含一个表单,其中action属性指向第2步。
问题是,如果在步骤2中检测到服务器端验证错误,我无法将用户发送回步骤1而不会丢失状态。
有没有人对此有一个相对整洁的解决方案?如果可能的话,我已经考虑过了,并且想避免以下情况:
使用JavaScript创建多个页面的错觉,而实际上只管理单个表单。这对我来说真的不起作用,好像在步骤1结束时存在服务器端验证错误,它只会在步骤4中检测到,它将完全破坏表单的流程。
添加if条件以根据ModelState选择视图。这是有问题的,因为这意味着视图将与URL不同步:即步骤1的提交将加载步骤2,这将显示步骤1中的视图。这可能会给用户造成混淆。
如果有人确实有任何好的解决方案我只能假设必须是一个非常常见的问题,我很乐意听到它们。我在这里找到的其他解决方案似乎属于上述两个答案中的一个,这两个答案都不适用于我。
答案 0 :(得分:2)
让我们说你的班级结构是这样的......
public class MyViewModel
{
public class Step1 { get; set;}
public class Step2 { get; set;}
public class Step3 { get; set;}
public class Step4 { get; set;}
}
您只需验证部分模型并重定向用户
即可public ActionResult Step2(MyViewModel model)
{
//Validate the first step
if(TryValidateModel(model.Step1)
{
//The details entered in step 1 are validate to move on to step 2
return View("Step2", model);
}
//Failed validation redirect to form one and display the errors
return RedirectToAction("Step1", model)
}
希望这有帮助