具有数据属性的SelectListItem

无论如何有一个SelectList预填充ViewModel与数据属性?

我想要做

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

所以它会生成如下代码:

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

这是简单的解决scheme。

并非所有东西都必须用.NET代码中的扩展方法来编写。 关于MVC的一个伟大的事情是它可以让您轻松访问构build自己的HTML。

使用MVC4,您可以使用助手HTML.NameForHTML.IdForexpression式树上元素的id和名称

 <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是公开每个属性的项目的集合。 那么你应该全部设置。

如果你想要可重用性,可以考虑把它作为一个Enumerable of Cities的编辑器模板

您将不得不扩展SelectListItem,然后扩展DropDownListFor以使用扩展的SelectListItem。

看看这个解决scheme:

在Html.DropDownList的<option>下添加html类标记