2010-03-07 41 views
12

Tôi đang cố gắng hiểu cách tốt nhất để triển khai một DropDownList trong ASP.NET MVC 2 bằng cách sử dụng trình trợ giúp DropDownListFor. Đây là câu hỏi nhiều phần.Cách tốt nhất để triển khai DropDownList trong ASP.NET MVC 2?

Đầu tiên, cách tốt nhất để chuyển dữ liệu danh sách vào chế độ xem là gì?

  1. Vượt qua danh sách trong mô hình của bạn với một tài sản có chứa dữ liệu
  2. SelectList Vượt qua danh sách trong qua ViewData

Làm thế nào để có được một giá trị trống trong DropDownList? Tôi có nên xây dựng nó vào SelectList khi tôi đang tạo nó hoặc có một số phương tiện khác để nói cho người trợ giúp tự động tạo một giá trị trống không?

Cuối cùng, nếu vì một lý do nào đó có lỗi máy chủ và tôi cần hiển thị lại màn hình với DropDownList, tôi có cần tìm nạp lại giá trị danh sách để chuyển sang mô hình chế độ xem không? Dữ liệu này không được duy trì giữa các bài viết (ít nhất là không phải khi tôi vượt qua nó thông qua mô hình xem của tôi) vì vậy tôi sẽ chỉ lấy lại nó (nó được lưu trữ). Tôi đang đi về điều này một cách chính xác?

Trả lời

9

Tốt nhất là để tạo ra một SelectList trong điều khiển của bạn - sử dụng phương pháp mở rộng của tôi ở đây: http://blog.wekeroad.com/2010/01/20/my-favorite-helpers-for-aspnet-mvc

Pop đó vào ViewData sử dụng phím giống như tên tài sản của bạn: ViewData["statusid"]=MySelectList

Sau đó, chỉ cần sử dụng Html.DropDownFor(x=>x.StatusID) và bạn đã sẵn sàng.

+1

Sự cố khi sử dụng Chế độ xem là nó khiến bộ điều khiển của bạn khó kiểm tra hơn. Nếu bạn giữ mọi thứ trong ViewModel thì các bài kiểm tra của bạn sẽ tốt hơn nhiều. – Mac

+2

Nó thực sự không khác gì cả - với ViewModel bạn phải say mê ViewData.Model, nếu không bạn chỉ cần yêu cầu nó bằng một phím. Không có sự khác biệt nào cả ... –

+0

http://stackoverflow.com/a/5177332/986862 –

0

(Bạn biết điều này rồi!)

  1. Vượt qua danh sách trong mô hình của bạn với một tài sản SelectList có chứa dữ liệu

Vâng, thêm nó khi bạn xây dựng các SelectList. (Nếu bạn xây dựng danh sách bằng LINQ, Liên minh có thể hữu ích.)

Có thể làm, và có bạn.

3

trả lời trong phần:

  1. Các IMHO cách tốt nhất là phải vượt qua danh sách trong ViewModel như thế này:

    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. Để có được một lựa chọn trống hoặc mặc định như (- Pick màu -), bạn có thể làm điều này ở mặt bên:

    @Html.DropDownListFor(m => m.Color, Model.Colors, "-- Pick a color --") 
    
  3. Bạn sẽ phải tìm nạp/điền lại danh sách nếu nó là một phần của ViewModel.


Hãy xem các bài viết trên blog sau.Nó có thể cung cấp cho bạn một số lời khuyên:

Drop-down Lists and ASP.NET MVC

2

Bạn có thể làm một cái gì đó như:

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

hoặc

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

Các param cuối cùng 'optionLabel' làm cho một mục danh sách trống

Trong trường hợp này, bạn có thể thấy ListItems là thuộc tính của mô hình.

Tôi cũng đã tạo chế độ xem mạnh mẽ cho kiểu máy.

0

Tôi thấy nó trực quan hơn để làm việc với một chuỗi các SelectListItems (chứ không phải là một SelectList).

Ví dụ: điều này sẽ tạo ra một IEnumerable<SelectListItem> từ chuỗi các đối tượng khách hàng mà bạn có thể chuyển đến trình trợ giúp Html.DropDownListFor (...). Thuộc tính 'Đã chọn' sẽ tùy chọn đặt mục mặc định trong danh sách thả xuống.

var customers = ... // Get Customers 
var items = customers.Select(c => new SelectListItem 
          { 
           Selected = (c.Id == selectedCustomerId), 
           Text = c.Email, 
           Value = c.Id.ToString() 
          }); 
Các vấn đề liên quan