2012-04-11 63 views
1

是否可以在mvc3中有一个多步表单(向导)? 使其变得简单:修改产品的2步表单。mvc3多步表单(向导)

可能的解决方案:使用相同的viewbag.Product以不同的形式(将它从一个传递到另一个)。

谢谢。

+1

[多步注册过程问题在asp.net mvc(splitted viewmodels,单一模型)]中可能的重复](http://stackoverflow.com/questions/6402628/multi-step-registration-process-issues-in -asp-net-mvc-splitted-viewmodels-sing) – 2012-04-11 16:45:13

+0

看看这个[博客](http://afana.me/post/create-wizard-in-aspnet-mvc-3.aspx) – Dmitry 2012-04-11 16:59:05

+0

可能的重复[任何示例MVC3向导应用程序(多步骤)(无JQUERY)](http://stackoverflow.com/questions/8054640/any-sample-mvc3-wizard-apps-multi-step-no-jquery) – jgauffin 2012-06-12 17:33:10

回答

1

向导只是处理简单模型的简单步骤。没有理由为向导创建多个模型。你所要做的就是创建一个单一模型,并在单个控制器中的动作之间传递它。

public class MyModel 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id { get; set }; 
    public string StepOneData { get; set; } 
    public string StepTwoData { get; set; } 
} 

上述coed是愚蠢的简单,所以在那里取代你的领域。接下来,我们从启动我们向导的简单操作开始。

public ActionResult WizardStep1() 
    { 
     return View(new MyModel()); 
    } 

这调用视图“WizardStep1.cshtml(如果使用剃刀即是)。你可以用创建模板向导,如果你想要的。我们只是将被重定向到后一个不同的动作。

<WizardStep1.cshtml> 
@using (Html.BeginForm("WizardStep2", "MyWizard")) { 

说明的一点是,我们将张贴这不同的操作;在WizardStep2行动

[HttpPost] 
    public ActionResult WizardStep2(MyModel myModel) 
    { 
     return ModelState.IsValid ? View(myModel) : View("WizardStep1", myModel); 
    } 

在这次行动中,我们检查,如果我们的模型是有效的,如果是这样,我们将其发送到我们的向导tep2.cshtml查看其他我们发送回到第一步验证错误。在每一步中,我们将它发送到下一步,验证该步骤并继续前进。现在一些精明的开发人员可能会说,如果我们在步骤之间使用[必需的]属性或其他数据注释,我们就不能在这种步骤之间移动。你会是对的,所以删除那些还没有被检查的项目上的错误。如下所示。

[HttpPost] 
    public ActionResult WizardStep3(MyModel myModel) 
    { 
     foreach (var error in ModelState["StepTwoData"].Errors) 
     { 
      ModelState["StepTwoData"].Errors.Remove(error); 
     } 

最后我们将模型保存一次到数据存储。这也阻止了启动向导的用户,但没有完成它不将不完整的数据保存到数据库。

我希望你发现这个实现向导的方法比任何前面提到的方法更容易使用和维护。

感谢您的阅读。