喬納斯絕對是對的。下面進一步細分。
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);
}
最後我們將模型保存一次到數據存儲。這也阻止了啓動向導的用戶,但沒有完成它不將不完整的數據保存到數據庫。
我希望你發現這個實現嚮導的方法比任何前面提到的方法更容易使用和維護。
感謝您的閱讀。
你能詳細說明「沒有jQuery」的要求嗎?是否允許使用JavaScript?是否允許任何JavaScript庫或框架? – David
@David感謝您的快速響應。我正在使用OrchardCMS v1.3,而ClientSideValidation目前在此情況下不可行。另外,我使用了一些動態元素,我的理解是,在這種情況下ClientSideValidation不能很好地工作(請參閱http://xhalent.wordpress.com/2011/01/24/applying-unobtrusive-validation-to-dynamic-content /);雖然,鑑於我的第一個限制,解決方法並沒有幫助。 –
注意:詳細的解決方案在http://stackoverflow.com/questions/6402628/multi-step-registration-process-issues-in-asp-net-mvc-splitted-viewmodels-sing?answertab=votes#tab-top有一個評論關於它不是健全的做法9個「步驟」來堅持這麼多的信息。對我而言,這也可能是一個問題,因爲我已經將我的表格分成至少7個步驟(儘管最後一個是確認)。 –