53

Có cách nào để có một SelectList được chuẩn bị sẵn trên ViewModel với các thuộc tính dữ liệu không?SelectListItem với các thuộc tính dữ liệu

tôi muốn làm

@Html.DropdownListFor(m=> m.CityId, Model.Cities); 

nên nó tạo ra mã như:

<select id="City" class="location_city_input" name="City"> 
    <option data-geo-lat="-32.522779" data-geo-lng="-55.765835" data-geo-zoom="6" /> 
    <option data-geo-lat="-34.883611" data-geo-lng="-56.181944" data-geo-zoom="13" data-geo-name="Montevideo" data-child=".state1" value="1">Montevideo</option>    
    <option data-geo-lat="-34.816667" data-geo-lng="-55.95" data-geo-zoom="13" data-geo-name="Canelones, Ciudad de la Costa" data-child=".state41" value="41">Ciudad de la Costa</option> 
</select> 

Trả lời

83

Đây là giải pháp đơn giản.

Không phải mọi thứ đều phải được viết bằng phương pháp mở rộng trong mã .NET. Một trong những điều tuyệt vời về MVC là nó cho phép bạn dễ dàng truy cập để xây dựng HTML của riêng bạn.

Với MVC4 bạn có thể lấy id và tên của phần tử trên cây biểu hiện với những người giúp đỡ HTML.NameForHTML.IdFor

<select name="@Html.NameFor(Function(model) model.CityId)" 
     id="@Html.IdFor(Function(model) model.CityId)" 
     class="location_city_input"> 
    @For Each city In Model.Cities 
     @<option value="@city.Value" 
       @(If(city.Value = Model.CityId, "selected", "")) 
       data-geo-lat="@city.Lat" 
       data-geo-lng="@city.Lng" 
       data-geo-zoom="@city.Zoom"> 
      @city.Text 
     </option> 
    Next 
</select> 

Giả sử Model.Cities là một bộ sưu tập các vật phẩm tiếp xúc với mỗi người trong số những tài sản. Sau đó, bạn nên được tất cả các thiết lập.

Nếu bạn muốn tái sử dụng, hãy xem xét làm cho nó một mẫu biên tập viên cho bất cứ điều gì đó là một Enumerable của thành phố

+2

Thú vị ... Tôi đã không 't biết về html.namefor vv Tôi sẽ cung cấp cho nó một thử –

+1

Lời khuyên tuyệt vời cho việc thêm tính linh hoạt thực sự dễ dàng vào html của bạn – ChandlerPelhams

+5

Vì razor2 bạn có thể đơn giản làm 'selected =" @ city.Value == Model.CityId "' và nó sẽ tạo ra đánh dấu đúng (hoặc 'selected =" selected "' hoặc không có gì) – Diego

9

Bạn sẽ phải mở rộng SelectListItem, và sau đó mở rộng DropDownListFor sử dụng SelectListItem mở rộng.

Có xem xét giải pháp này:

Adding html class tag under <option> in Html.DropDownList

+1

này trông giống như câu trả lời đúng nhưng dường như kinda xấu xí. Tôi thích viết bản thân mình hơn là mở rộng SelectListItem và DropDownListFor mà tôi nghĩ. Tôi không chắc. –

+3

Tôi không biết tại sao bạn nghĩ rằng nó xấu xí, nhưng nó có vẻ hợp lý hơn với tôi. Mỗi SelectListItem đại diện cho một thẻ tùy chọn trong html cuối cùng, và những gì bạn cần làm là thêm các thuộc tính html tùy chỉnh vào thẻ tùy chọn (SelectListItem), do đó, nó chỉ có ý nghĩa để mở rộng SelectListItem. – ataravati

+1

tôi nghĩ rằng nó xấu xí từ quan điểm khung mvc. nhưng giải pháp chính xác là cách giải quyết. –