Asp.net ASP-MVC中的多页表单
我有一个在ASP MVC中工作的表单,我希望在页面之间持久化数据(显然) 目前,我正在使用一个包含整个表单中所有字段的大视图模型。然后,我对表单的每个步骤都有一个操作:Asp.net ASP-MVC中的多页表单,asp.net,asp.net-mvc,forms,Asp.net,Asp.net Mvc,Forms,我有一个在ASP MVC中工作的表单,我希望在页面之间持久化数据(显然) 目前,我正在使用一个包含整个表单中所有字段的大视图模型。然后,我对表单的每个步骤都有一个操作: // STEP ONE public ActionResult Step1(MyViewModel model) { return View("Step1", model); } // STEP TWO public ActionResult Step2(MyViewModel model) { return
// 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而不丢失状态
有没有人有一个相对整洁的解决方案?我已经考虑过并希望尽可能避免以下情况:
如果有人对我只能假设是一个相当普遍的问题有什么好的解决方案,我很乐意听到他们。我在这里找到的其他解决方案似乎属于上述两个答案中的一个,这两个答案都不适用于我。假设您的类结构是这样的
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)
}
希望这有助于根据ModelState添加if条件以选择视图。这是有问题的,因为这意味着视图将与URL不同步:即,来自步骤1的提交将加载步骤2,这将显示来自步骤1的视图。这可能会给用户造成混乱。@ArijitMukherjee实际上似乎通过重定向而不是显示不同的视图来避免这种情况。@heymega我刚离开办公室,所以我明天会尝试一下,让你知道它是如何进行的。谢谢@heymega不幸的是,我无法让它工作-重定向没有发送模型数据(@gnack对每个表单步骤都有一个单独的url,这对您很重要?我发现现在更常见的做法是使用partialviews和ajaxtry
TempData[“Step2”]=model;