MVC工作流模型状态

时间:2014-01-13 10:04:03

标签: c# asp.net-mvc workflow state

我有一个MVC应用程序,其中包含一个或多个工作流程,非常相似但不同的工作流程。例如:

  • 第1步
  • 第2步
    • 步骤2a(以步骤2和状态为条件)
    • 步骤2b(以步骤2a和状态为条件)
  • 第3步
  • 完成

每个步骤都有与之相关的特定验证。目前,操作设置如下:

public controller Test
{
    public ActionResult Step1()
    {
        // validation (10-30 lines)

        // Store against model

        return RedirectToAction("Step2");
    }

    public ActionResult Step2()
    {
        // validation (10-30 lines)

        // Store against model

        return someCondition ? RedirectToAction("Step2a") : RedirectToAction("Step3");
    }

    public ActionResult Step2a()
    {
        // validation (10-30 lines)

        // Store against model

        return RedirectToAction("Step2");
    }
}
  1. 有没有办法return GetNextStep()?我在想一个状态机,但由于条件元素和状态(以及状态应该在哪里?在模型内部或单独的状态对象中?),我不确定这是否是最好的模式。 / LI>
  2. 每一步验证的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

创建一个模型,其中包含5个步骤中所需的所有字段。

public class FullForm
{

// fields for step 1 

public string FirstFieldOfStep1 {get; set;}
....

// put as many fields are there in step 1

//Fields For second step

public string FirstFieldOfStep2 {get; set;}

// all your conditional fields goes here
....


//Fields For Third step

public string FirstFieldOfStep3 {get; set;}


}

现在,在您的视图中,您可以拥有5个不同的HTML页面(每个步骤一个)。

在您的主视图中(让我们将其命名为MainForm.cshtml)您可以使用类似的开关案例。

    @{

    switch(find which field is yet to be filled)
    {
    case(if FirstFieldOfStep1 is null) : @Html.RenderPartial("Step1.cshtml");

    case(if FirstFieldOfStep2 is null) :  @Html.RenderPartial("Step2.cshtml");

    case(if FirstFieldOfStep3 is null) :  @Html.RenderPartial("Step3.cshtml");

    }
}

在Step2.cshtml中您可以检查条件并相应地调用其他两个视图。

在您的控制器中,您可以执行此操作。

public controller Test
{
    [HttpPost]
    public ActionResult Step1(FullForm fullFormDetails)
    {
       if(all the required fields are available with new values)
       {
          //save in database and proceed.
        }
      else
      {
         return View ("MainForm",fullFormDetails)
       }  

    }

}

所以基本上你在这里做的是你一点一点地收集表单细节,每次在控制器中你将整个数据传递给视图,以便它可以呈现需要收集数据的下一页。所以最后你只会保存整个表格一次。

您可以在MVC中自定义验证属性,这样您无需每次在控制器中验证表单。您可以在这里查看构建自定义属性并相应地为您的应用程序更改它,这是一种干净的方法。 Custom attribute in MVC