Asp.net 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

我有一个在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的视图。这可能会给用户带来困惑


  • 如果有人对我只能假设是一个相当普遍的问题有什么好的解决方案,我很乐意听到他们。我在这里找到的其他解决方案似乎属于上述两个答案中的一个,这两个答案都不适用于我。

    假设您的类结构是这样的

    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;