53

データ属性を持つViewModelにSelectListを事前入力する必要はありますか?データ属性を持つSelectListItem

私は

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

ので、それはのようなコードを生成したいと思う:あなたはSelectListItemを拡張して、拡張SelectListItemを使用するようにDropDownListForを拡張する必要があります

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

答えて

83

ここでは簡単な解決策です。

.NETコードでは、すべてを拡張メソッドで記述する必要はありません。 MVCの素晴らしい点の1つは、独自のHTMLを簡単に作成できることです。あなたは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> 

Model.Citiesと仮定すると、ヘルパーと式ツリー上の要素のidと名前を取得することができますMVC4で

は、これらのプロパティのそれぞれを公開するアイテムのコレクションです。それからすべてがセットになっているはずです。あなたが再利用したい場合は

、その都市

+2

興味深い...私didn html.nameforについて知っています。私は試してみましょう –

+1

あなたのhtmlに本当の簡単な柔軟性を加えるための素晴らしいアドバイス – ChandlerPelhams

+5

razor2以来、 'selected =" @ city.Value == Model.CityId "'を簡単に行うことができます – Diego

9

を。

は、このソリューションを見てください:

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

+1

の可算である何のためのエディタテンプレートにすることを検討これが正解のように見えますが、ちょっと醜いようです。私はむしろSelectListItemとDropDownListForを拡張するよりも自分自身を書くと思います。よく分かりません。 –

+3

なぜあなたはそれが醜いと思うか分かりませんが、それは私にはもっと論理的です。各SelectListItemは最終HTMLのオプションタグを表します。これは、オプションタグ(SelectListItem)にカスタムhtml属性を追加することで、SelectListItemを拡張するだけです。 – ataravati

+1

私はそれがmvcフレームワークの観点からは醜いと思う。解決策は対処する方法です。 –

関連する問題