2011-11-08 19 views
1

我一直在搜索GooglePlex上的高/低,這裏是一個示例MVC3嚮導(多步驟),它沒有使用MVC3的clientsidevalidation元素(和jQuery的)。我至少在這裏看到過一些元素的詳細解釋:multi-step registration process issues in asp.net mvc (splitted viewmodels, single model),但我一直無法使它正常工作。任何示例MVC3嚮導應用程序(多步)(無JQUERY)

作爲新來的MVC3和一般編程,我懷疑它的經驗水平,使我無法工作。

無論如何,對非Jquery MVC3嚮導示例的任何指導都會很棒。先謝謝你。

+1

你能詳細說明「沒有jQuery」的要求嗎?是否允許使用JavaScript?是否允許任何JavaScript庫或框架? – David

+0

@David感謝您的快速響應。我正在使用OrchardCMS v1.3,而ClientSideValidation目前在此情況下不可行。另外,我使用了一些動態元素,我的理解是,在這種情況下ClientSideValidation不能很好地工作(請參閱http://xhalent.wordpress.com/2011/01/24/applying-unobtrusive-validation-to-dynamic-content /);雖然,鑑於我的第一個限制,解決方法並沒有幫助。 –

+0

注意:詳細的解決方案在http://stackoverflow.com/questions/6402628/multi-step-registration-process-issues-in-asp-net-mvc-splitted-viewmodels-sing?answertab=votes#tab-top有一個評論關於它不是健全的做法9個「步驟」來堅持這麼多的信息。對我而言,這也可能是一個問題,因爲我已經將我的表格分成至少7個步驟(儘管最後一個是確認)。 –

回答

5

如果不允許的jQuery/JavaScript的使用

  1. 爲嚮導
  2. 創建一個包含該向導將設置各領域的模型創建一個控制器,我會做這樣的事情。
  3. 爲每個嚮導頁創建一個動作,所有動作都應該使用相同的模型
  4. 創建一個將所有內容保存到數據庫的最終操作。
+0

在我看來,這是行不通的,因爲你不會使用Action中的所有數據,當你回發給控制器時,你將失去所有未使用的字段。所以你必須使用會話或使用隱藏字段(創建某種視圖狀態)。真的嗎? –

+0

正確。你必須使用隱藏的字段。 – jgauffin

+0

謝謝,我只是添加了一個div並在其中添加了所有元素。它像一個魅力。謝謝... –

4

喬納斯絕對是對的。下面進一步細分。

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); 
     } 

最後我們將模型保存一次到數據存儲。這也阻止了啓動向導的用戶,但沒有完成它不將不完整的數據保存到數據庫。

我希望你發現這個實現嚮導的方法比任何前面提到的方法更容易使用和維護。

感謝您的閱讀。

+0

我們將如何處理嚮導不是簡單的next,next,next的情況,而是根據以前的答案決定下一個要顯示的視圖的邏輯視圖?謝謝 –

+1

這需要一個完整的樣本。 ;)@SamDelaney,你可以嘗試在控制器中做一些if/else邏輯(如果步驟1中的單選按鈕1是yes,那麼執行此操作,否則執行此操作)。 – REMESQ