2009-05-19 14 views
2

我的項目中的所有控制器都從一個基本控制器繼承而來,該控制器擁有我的實體模型屬性。ASP.NET MVC:是否允許幫助程序獲取數據?

讓我說我有一個視圖,顯示世界上的城市,它可以選擇按國家過濾。國家過濾器是數據庫中國家的下拉列表。下拉列表的Html助手請求IEnumerable<SelectItem>

與信息

現在是確定的,如果我創建了一個HtmlHelper,看起來像這樣:

public static IEnumerable<SelectListItem> GetCountries(HtmlHelper htmlHelper) 
    { 
     return (from c in ((BaseController) htmlHelper.ViewContext.Controller).Entities.Countries 
       orderby c.Name 
       select new SelectListItem() {Text = c.Name, Value = c.ID}); 


    } 

的問題是不是如果我是可以的,但如果它根據的MVC方式是確定做事。 (或者我應該將ViewData中的國家的集合放在控制器內嗎?)

回答

3

我會將數據作爲參數傳遞給GetCountries方法。 htmlHelper函數真的不應該知道你的基本控制器的屬性 - 如果有人曾經在一個不能從你的基地繼承的控制器上使用它,該怎麼辦?我知道我知道,你控制的代碼,等等等等。如果您真的對最佳實踐感興趣,請避免依賴。

public static IEnumerable<SelectListItem> GetCountries(this HtmlHelper html, Countries countries) { 
    return from c in countries 
      order by c.Name 
      select new SelectListItem 
      { 
       Text = c.Name, 
       Value = c.ID 
      }; 
} 

然後,在你的視野:http://nerddinnerbook.s3.amazonaws.com/Part6.htm

基本上你創建一個封裝了所有數據,你一個ViewModel類:

<%=Html.GetCountries(this.Entities.Countries)%> 
+0

但我怎麼得到我的ViewPage內的國家? 我的ViewPage中的主要項目是IEnumerable 。所以我應該把國家集合放入ViewData(ViewData [「countries」])。 您的代碼建議您創建一個從原始ViewPage繼承並添加Entities屬性的新ViewPage(看起來像很多依賴項)。 – Gidon 2009-05-19 07:17:16

+3

您可以創建一個包含城市和國家的視圖模型。 – Morph 2009-05-19 07:28:39

1

退房視圖模型模式,它在的NerdDinner教程中提到的可能需要您的看法。因此,您將擁有一個包含所有城市和/或國家/地區的列表的類,以及其他任何在控制器操作中實例化/填充的其他類。

然後,您可以強烈地鍵入您的視圖以使用該ViewModel類和blammo:您已獲取了表單所需的所有數據。

0

我認爲html helper應該返回html。 所以,你有兩種方法:

第一,如果你想這樣做,因爲你開始,從你的HtmlHelper準備元素的列表,然後調用html.RenderDropDown與初始化列表中,選擇元素等等......

秒,可以將所有準備在你的模型,所以控制器將通發起對象的所有元素,你需要那麼在您查看您可以撥打renderdropdown直接

歡呼