53

Veri niteliklerine sahip ViewModel'de önceden seçilmiş bir SelectList'e sahip olmak var mı?Veri niteliklerine sahip SelectListItem

Ben

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

yüzden böyle bir kod üretir yapmak istiyorum:

<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> 

cevap

83

Burada basit çözüm:

bu çözüme bakın.

.NET kodunda her şey uzantı yöntemiyle yazılmamalıdır. MVC ile ilgili harika şeylerden biri, kendi HTML'nizi oluşturmanıza kolay erişim sağlamasıdır. Eğer Model.Cities varsayarsak yardımcıları HTML.NameFor ve HTML.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> 

ile ifade ağaç üzerinde elemanın kimliğini ve adını alabilirsiniz MVC4 ile

bu özelliklerin her birinin maruz öğelerin topluluğudur. Öyleyse hepiniz ayarlanmalı. Eğer yeniden kullanılabilirliği istiyorsanız

, o Kentler

+2

İlginç ... I didn html.namefor hakkında birşey bilmiyorum, bunu bir deneyin –

+1

html'nize gerçek kolay esneklik eklemek için harika tavsiyeler – ChandlerPelhams

+5

jilet2'den beri basitçe 'selected = "@ city.Value == Model.CityId" ' ve doğru biçimlendirmeyi oluşturacaktır (ya da "selected =" selected "" ya da ") – Diego

9

Sen SelectListItem uzatmak ve ardından genişletilmiş SelectListItem kullanmak DropDownListFor uzatmak gerekecek.

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

+1

bu doğru cevap gibi görünüyor ama biraz çirkin görünüyor bir Enumerable olan şey için bir editör şablonu yapmayı düşünün. SelectListItem ve DropDownListFor'ı genişletmekten ziyade kendimi seçiyorum. Emin değilim. –

+3

Neden bunun çirkin olduğunu düşünüyorsun, ama bana göre daha mantıklı geliyor. Her SelectListItem, son html'de bir seçenek etiketini temsil eder ve yapmanız gereken şey, seçenek etiketine (SelectListItem) özel html öznitelikleri eklemektir, bu nedenle yalnızca SelectListItem öğesini genişletmek mantıklıdır. – ataravati

+1

Bence mvc çerçeve perspektifinden çirkin. ama çözüm tam olarak nasıl başa çıkılacağıdır. –