2010-03-07 44 views
12

我想了解在ASP.NET MVC 2中使用DropDownListFor幫助程序實現DropDownList的最佳方式。這是一個多部分問題。在ASP.NET MVC 2中實現DropDownList的最佳方式?

首先,將列表數據傳遞給視圖的最佳方式是什麼?

  1. 合格名單在你的模型包含數據
  2. 一個SelectList財產轉至通過ViewData

我如何在DropDownList空值列表?我是否應該在創建時將其構建到SelectList中,或者是否有其他方法可以告訴幫助程序自動創建空值?

最後,如果由於某種原因存在服務器端錯誤,我需要重新顯示屏幕DropDownList,我是否需要再次獲取列表值以傳入視圖模型?這些數據不會在帖子之間維護(至少在我通過視圖模型傳遞的時候不會),所以我只需要再次獲取它(緩存)。我正確地處理這個問題嗎?

回答

9

最好的辦法是建立在你的控制器中的SelectList - 用我的擴展方法在這裏: ViewData["statusid"]=MySelectList

然後只需使用:即到的ViewData使用相同的密鑰爲您的屬性名稱 http://blog.wekeroad.com/2010/01/20/my-favorite-helpers-for-aspnet-mvc

流行Html.DropDownFor(x=>x.StatusID),你全都準備好了。

+1

使用ViewData時遇到的問題是它使您的控制器難以測試。如果你把所有東西放在ViewModel中,你的測試會更好。 – Mac 2010-04-30 00:17:07

+2

實際上並沒有什麼不同 - 使用ViewModel你必須拼出ViewData.Model,否則你只需要用一個鍵來請求它。沒有區別... – 2010-06-02 03:55:09

+0

http://stackoverflow.com/a/5177332/986862 – 2013-12-11 12:21:42

0

(你知道這個了!)

  1. 與包含數據

是,添加它,當你建立了一個的SelectList屬性的SelectList傳遞模型中的列表。 (如果你使用LINQ構建列表,Union可能會派上用場。)

是的,你是。

3

接聽零件:

  1. 的最佳方式恕我直言,是通過在ViewModel這樣的名單:

    public SelectList Colors 
    { 
        get 
        { 
         // Getting a list of Colors from the database for example... 
         List<Color> colors = GetColors().ToList(); 
    
         // Returning a SelectList to be used on the View side 
         return new SelectList(colors, "Value", "Name"); 
        } 
    } 
    
  2. 要得到這樣一個空白或默認選項( - 匹克

    @Html.DropDownListFor(m => m.Color, Model.Colors, "-- Pick a color --") 
    
  3. : - 顏色),您可以在觀看側的做到這一點如果它是ViewModel的一部分,則必須再次獲取/填充列表。


看看下面的博客文章。它可以給你一些提示:

Drop-down Lists and ASP.NET MVC

2

你可以這樣做:

<%= Html.DropDownListFor((x => x.ListItems), Model.ListItems, "")%> 

<%= Html.DropDownList("ListItems", Model.ListItems, "")%> 

最後PARAM 'optionLabel' 讓一個空白列表項

在這種情況下,您可以看到ListItems是模型的一個屬性。

我也強制類型化視圖模型。

0

我發現使用一系列SelectListItems(而不是SelectList)更直觀。

例如,這會從客戶對象序列創建IEnumerable<SelectListItem>,您可以將其傳遞給Html.DropDownListFor(...)助手。 'Selected'屬性可以選擇在下拉列表中設置默認項目。

var customers = ... // Get Customers 
var items = customers.Select(c => new SelectListItem 
          { 
           Selected = (c.Id == selectedCustomerId), 
           Text = c.Email, 
           Value = c.Id.ToString() 
          }); 
相關問題