我有一个MVC应用程序,其中包含一个或多个工作流程,非常相似但不同的工作流程。例如:
每个步骤都有与之相关的特定验证。目前,操作设置如下:
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");
}
}
return GetNextStep()
?我在想一个状态机,但由于条件元素和状态(以及状态应该在哪里?在模型内部或单独的状态对象中?),我不确定这是否是最好的模式。 / LI>
答案 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。