2014-01-13 92 views
1

我有一個MVC應用程序,其中有一個或多個工作流程,非常相似但不同的工作流程。例如:MVC工作流模型狀態

  • 步驟1
  • 步驟2
    • 步驟2a
    • 步驟2b(在步驟2a &狀態條件)
  • 工序(上步驟2 &狀態條件) 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()的一種方式?我在想一個狀態機,但我不確定這是否是由於條件元素和狀態(以及狀態應該在哪裏生存?模型內部還是獨立狀態對象?)最好的模式。
  2. 什麼是驗證每一步的最佳方式?
+0

你是否在每一步使用不同的模型? –

+0

目前是。但我期待重新建模使用單個模型並僅綁定到正確的屬性。 –

+0

所以你可以用你需要的5個步驟構建一個包含所有字段的模型。並且在每一步中,您都可以將控件傳遞給控制器​​並返回下一個步驟視圖。 –

回答

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

+1

我沒有使用Visual Studio,所以查找錯別字。 –