Asp.net mvc Razor DropDownList for:向SelectList选项标记添加额外属性

Asp.net mvc Razor DropDownList for:向SelectList选项标记添加额外属性,asp.net-mvc,razor,html-select,Asp.net Mvc,Razor,Html Select,我正在尝试创建一个选择列表。我使用viewmodel中的集合创建了它,该集合允许我使用以下代码设置每个选项的值和文本: @Html.DropDownListFor(model => model.Networks, new SelectList(Model.Networks, "NetworkID", "Name"), new { @class="form-control" }) Networks包含另一个名为CountryId的属性。我想为每个选项标记添加一个属性,使其看起来像: <

我正在尝试创建一个选择列表。我使用viewmodel中的集合创建了它,该集合允许我使用以下代码设置每个选项的值和文本:

@Html.DropDownListFor(model => model.Networks, new SelectList(Model.Networks, "NetworkID", "Name"), new { @class="form-control" })
Networks包含另一个名为CountryId的属性。我想为每个选项标记添加一个属性,使其看起来像:

<option value="[NetworkId]" data-countryId="[CountryId]">Canada</option>
加拿大

我应该怎么做?

您可以创建一个表单帮助器类来创建一个自定义下拉列表,并创建一个自定义的“selectListItem”类,该类具有IDictionary类型的额外属性“itemsHtmlAttributes”-请参见下文。您可能需要使用“id”或“name”属性来实现默认模型绑定。下面有点混乱,我建议使用TagBuilder构建“选择”和“选项”标记:

public class SelectListItemCustom : SelectListItem
{
    public IDictionary<string, object> itemsHtmlAttributes { get; set; }
}

public static class FormHelper
{
    public static MvcHtmlString DropDownListForCustom(this HtmlHelper htmlHelper, string id, List<SelectListItemCustom> selectListItems)
    {
        var selectListHtml = "";

        foreach (var item in selectListItems)
        {
            var attributes = new List<string>();
            foreach (KeyValuePair<string, string> dictItem in item.itemsHtmlAttributes)
            {
                attributes.Add(string.Format("{0}='{1}'", dictItem.Key, dictItem.Value));
            }
            // do this or some better way of tag building
            selectListHtml += string.Format(
                "<option value='{0}' {1} {2}>{3}</option>", item.Value,item.Selected ? "selected" : string.Empty,string.Join(" ", attributes.ToArray()),item.Text);
        }
        // do this or some better way of tag building
        var html = string.Format("<select id='{0}' name='{0}'>{1}</select>", id, selectListHtml);

        return new MvcHtmlString(html);
    }
}
public类SelectListItemCustom:SelectListItem
{
公共IDictionary itemsHtmlAttributes{get;set;}
}
公共静态类FormHelper
{
自定义的公共静态MvcHtmlString DropDownList(此HtmlHelper HtmlHelper,字符串id,列表selectListItems)
{
var selectListHtml=“”;
foreach(selectListItems中的变量项)
{
var attributes=新列表();
foreach(item.itemsHtmlAttributes中的KeyValuePair术语)
{
Add(string.Format(“{0}='{1}',dictItem.Key,dictItem.Value));
}
//这样做或者用一些更好的方法来标记构建
selectListHtml+=string.Format(
“{3}”,item.Value,item.Selected?“Selected”:string.Empty,string.Join(“,attributes.ToArray()),item.Text);
}
//这样做或者用一些更好的方法来标记构建
var html=string.Format(“{1}”,id,selectListHtml);
返回新的MvcHtmlString(html);
}
}
视图:

@{
var item=new-SelectListItemCustom{Selected=true,Value=“123”,Text=“Australia”,itemsHtmlAttributes=new-Dictionary{{“countrycode”,“au”};
var items=新列表{item};
Html.Raw(Html.DropDownListForCustom(“insertdhere”,items))
}

我无法使用此代码-我在“ForEach”方法上遇到一个错误,表示该方法在IDictionary definition.ForEach(KeyValuePair)中不存在
@{
    var item = new SelectListItemCustom { Selected = true, Value = "123", Text = "Australia", itemsHtmlAttributes = new Dictionary<string, object> { { "countrycode", "au" } } };
    var items = new List<SelectListItemCustom> { item };

    Html.Raw(Html.DropDownListForCustom("insertIdHere", items))
}