2009-05-15 48 views
14

我想分配一個SelectList()中的項目的靜態列表到ASP.NET MVC中的Html.DropDownList(),最佳做法是什麼?如何在MVC中添加項目的靜態列表Html.DropDownList()

我正要試圖找到一種方法,使用new SelectList(new {key = "value"}...但一個,沒有工作,兩個,我會在這裏打破了法律,應我的靜態列表中ViewData反正聲明和IList/IENumerable通過呢?

回答

3

好吧,我決定把我自己的意見,這應該在控制器中定義:

僅供參考,我剛回到:

PageData data = new PageData() 
      { 
       Formats = new[] 
          { 
           new { ID = "string", Name = "Text" }, 
           new { ID = "int", Name = "Numeric" }, 
           new { ID = "decimal", Name = "Decimal" }, 
           new { ID = "datetime", Name = "Date/Time" }, 
           new { ID = "timespan", Name = "Stopwatch" } 
          }, 
       ............. 

      }; 
return View(data); 

...(忽略上下文),並在觀ASPX方:

<%= Html.DropDownList("type.field", new SelectList(ViewData.Model.Formats, "ID", "Name"... 

如果有人有這樣做的最佳方式,我會很樂意接受他們的答案。

+0

我選擇了我的答案,因爲它是我一起去的。 – GONeale 2009-05-21 01:07:35

+0

這工作正常,但如果我想下拉加載作爲啓動值的小數,我該怎麼辦? – Sakthivel 2013-06-07 07:27:53

23

最好不要在視圖中創建SelectList。您應該在控制器中創建它並使用ViewData傳遞它。

實施例:

var list = new SelectList(new [] 
              { 
               new {ID="1",Name="name1"}, 
               new{ID="2",Name="name2"}, 
               new{ID="3",Name="name3"}, 
              }, 
          "ID","Name",1); 
      ViewData["list"]=list; 
      return View(); 

傳遞到構造:了IEnumerable對象,值字段中的文本字段和所選擇的值。

在查看

<%=Html.DropDownList("list",ViewData["list"] as SelectList) %> 
+0

與Marwan達成一致。創建一個SelectList對象並將其傳遞給你的View。就我個人而言,我會有強烈的意見,但這不在這個問題的範圍之內。 – 2009-05-16 14:22:59

+0

我使用強類型視圖,爲什麼要在視圖中定義SelectList?這是一個'視角 - 特別'的東西?我認爲簡單地公開數據會更好,這就是你想要給出的觀點,數據而不是上下文和數據。 – GONeale 2009-05-18 23:49:30

+0

其實我認爲這是非常錯誤的,SelectList用於呈現完全UI特定的下拉列表。如果我現在想要將這些數據用於複選框列表或不支持SelectList的東西? – GONeale 2009-05-18 23:52:29

11

所有MVC菜鳥最初避免「M」字,但它確實有點在MVC縮寫的起點開始。所以也許,也許,你可能想用模型開始你的解決方案......只是說。

不要重複自己(DRY)。您將最終將「新的PageData()」複製並粘貼到將選項列表傳遞給View的每個Controller。然後,您將要刪除或添加一個選項,並且必須編輯每個控制器的PageData。此外,您希望輸入最少量的代碼,使用最少的不必要冗長的「添加」,「新」,「IS」和「名稱」。由於在選擇選項(和/或單選按鈕列表)中只有一個鍵值對,因此可以使用最輕的數據結構,即字典 - 在您的模型中。

然後,只需在控制器中引用模型,然後使用包含LINQ Lambda表達式的DropDownListFor將字典轉換爲視圖中的SelectList。

威脅?你不是一個人。我當然是。下面是我用來教我的男,在V和C的例子:MVC的

模型部分:

using System.Web.Security; 
using System.Collections.Generic; 
using System.Text; 
using System.Linq.Expressions; 
using System.Web.Routing; 
using System.Web.Helpers; 
using System.Web.Mvc.Html; 
using MvcHtmlHelpers; 
using System.Linq; 

// EzPL8.com is the company I work for, hence the namespace root. 
    // EzPL8 increases the brainwidths of waiters and bartenders by augmenting their "memories" with the identifies of customers by name and their food and drink preferences. 
    // This is pedagogical example of generating a select option display for a customer's egg preference. 

namespace EzPL8.Models  
{ 
    public class MyEggs  
    { 
     public Dictionary<int, string> Egg { get; set; } 

     public MyEggs() //constructor 
     { 
      Egg = new Dictionary<int, string>() 
      { 
       { 0, "No Preference"}, //show the complete egg menu to customers 
       { 1, "I hate eggs"}, //Either offer an alternative to eggs or don't show eggs on a customer's personalized dynamically generated menu 

       //confirm with the customer if they want their eggs cooked their usual preferred way, i.e. 
       { 2, "Over Easy"}, 
       { 3, "Sunny Side Up"}, 
       { 4, "Scrambled"}, 
       { 5, "Hard Boiled"}, 
       { 6, "Eggs Benedict"} 
      }; 
    } 
} 

的控制器是現在相當簡單,只是路過的模型。它避免了創建一個孤立的概念,這可能不是孤立於一個頁面。:

public ActionResult Index() 
{ 
    var model = new EzPL8.Models.MyEggs(); 
    return View(model); 
} 

視圖使用DropDownListFor(而不是DropDownList的),而且需要一個Lambda表達式用於在事件重構強類型:

@Html.DropDownListFor(m => m.Egg, new SelectList(Model.Egg, "Key", "Value")) 

瞧,所得到的HTML:

<select id="Egg" name="Egg"> 
<option value="0">No Preference</option> 
<option value="1">I hate eggs</option> 
<option value="2">Over Easy</option> 
<option value="3">Sunny Side Up</option> 
<option value="4">Scrambled</option> 
<option value="5">Hard Boiled</option> 
<option value="6">Eggs Benedict</option> 
</select> 

請注意:不要被SelectList()中的「Value」中的值「<option value="6">」中的VALUE弄錯,該值是文本/標題(例如Eggs Benedict)t帽子在選項標籤之間結束。

使用案例: 爲了減少應用程序和數據庫之間我創建了一個靜態列表,以避免下拉很少,如果發生了改變,列表中的數據庫查詢的流量。然而,改變是不可避免的,從現在開始,在我顧客餐廳用餐的六個月後,不是因爲綠色的火腿,而是因爲他們對雞蛋過敏,廚師混入一些華夫餅。

餐廳需要更新其客戶信息,以便立即包括食物過敏。雖然他們喜歡回頭客,但對於死去的客戶迴歸爲無法支付因爲他們的信用卡被取消的殭屍而言並不酷。

修辭問題:我應該修改所有與顧客蛋愛好有關的控制器和視圖嗎?或者直接在模型中插入{7,「過敏蛋」}?

另一個修辭問題:是不是煎蛋?你想添加{8,「煎蛋卷,西方」},{9,「煎蛋,蘑菇-Feta-Spinach」}一次模型,並添加新的自動傳播在所有視圖中的所有下拉列表中使用它們?

底線(S),這大概比你要的,......但你沒有說MVC,不僅僅是VC方式更多:
1.使用* 中號 * VC模型。 2.當選擇列表僅基於「主鍵」和標題時,使用模型中的字典。 3.如果您的靜態列表與某個數據庫查找表沒有聯繫,那麼您的應用可能不是非常有用。將選項添加到靜態列表時,很可能還需要對查找表執行插入操作,以避免與數據庫中其他表的主鍵/外鍵關係完整性錯誤。 4.使用lambda和強類型數據結構來避免錯誤並獲得預先支持。

+0

什麼是所有的'EzPL8'引用?我迷路了......還是我錯過了這個笑話? – 2013-03-07 16:01:32

+1

-1爲EzPL8故事。用於將數據拉出模型的+1。 – 2013-03-19 23:25:41

相關問題