2008-11-26 64 views
4

我使用MVC來驗證一些HTML文本框的網頁上,例如在我的控制器有ASP.NET MVC的驗證和意見

 if (String.IsNullOrEmpty(name)) 
     { 
      ModelState.AddModelError("name", "You must specify a name."); 
     } 


     if (ViewData.ModelState.IsValid) 
     { 
      return RedirectToAction("Index"); 
     } 

返回查看();

問題在這裏,如果驗證失敗,它返回視圖失敗(「添加」)原因控制器不處理返回view()視圖,一個選項將使用RedirectToView(「viewname」);並且這將工作得很好,除非它沒有通過驗證AddModelError的東西(「就好像是第一次加載頁面一樣」)。

我可以通過在返回View()之前重複用於填充SelectList框的代碼來獲得此代碼。

這樣

 ViewData["rooms"] = new SelectList(Villa.intList(10)); 
     ViewData["sleeps"] = new SelectList(Villa.intList(20)); 
     ViewData["accomodationType"] = new SelectList(accomodationList, "accomodationId", "accomodationType"); 
     ViewData["regionName"] = new SelectList(regionList, "regionId", "regionName"); 
     return View(); 

工作正常,但是,我認爲這是一個更好的辦法,而不是重複的代碼塊,沒有人知道返回重定向視圖,並傳遞給它的模型誤差的任何方式?

在此先感謝,希望它能提供某種意義。

回答

4

就拿你在(GET)添加動作初始化ViewData的代碼,它(提取法)重構爲一個獨立的,私人方法。從您的(GET)添加操作中調用該方法。現在在POST操作中(我假設,你在上面顯示的內容;目前尚不清楚),你可以調用相同的私有方法來填充ViewData。現在你不再有任何重複的代碼。請記住,ViewData是Controller類型的屬性,因此您可以將它設置在任何地方,而不僅僅是在操作方法本身中。

+0

尚未測試,但它是有道理的,不知道你可以做一個ActionResult方法之外!謝謝 – Tablet 2008-11-26 15:14:39

0

我必須承認,我完全明白你的意思有些困惑,所以這是一種可能不準確的通用答案!

http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx

這是一個良好的閱讀。

我可以想到兩種方法。

要更改最少量的代碼,只需將您的ViewData放入TempData並在重定向檢索後即可。

可能更爲接受的答案是使用上面鏈接中描述的方法。讓你的表單發回相同的動作。該行動將有兩個實施 - 一個郵政和一個獲取。在Post操作中,執行所有驗證邏輯。如果驗證有效,則對成功顯示的任何視圖執行重定向操作(Post-Redirect-Get模式)。如果驗證失敗,則重新顯示與顯示驗證錯誤的表單相同的視圖。

如果這不是你問什麼,還是讓我知道了〜