MVC3 SelectListItem。是否可以使用自定义html属性来装饰它?

时间:2011-04-05 17:02:15

标签: c# asp.net-mvc-3 drop-down-menu razor

如果我有这样的话:

@{
   var cats = GetCategories();
   var selectList = from c in cats
   select new SelectListItem
   {
     Selected = (c.Id == Model.SessionCategory.Id),
     Text = c.Name,
     Value = c.Id.ToString(),
    };
  }
 @Html.DropDownList("categories", selectList)

标记将是这样的:

 <select id="categories" name="categories">
    <option value="1">Category1</option>
    <option value="2">Category2</option>
    <option selected="selected" value="3">Category3</option>
 </select>

现在,问题是:

是否可以为每个<option>标记添加其他属性? 我的意思是从Razor模板。没有jQuery解决方法?

3 个答案:

答案 0 :(得分:4)

我认为最实用的解决方案是一些jQuery或类似的东西..

<select id="categories" name="categories">
    @foreach (var item in selectList) {
        <option @if (item.Selected) { <text>selected="selected"</text>} value="@item.Value">@item.Text</option>
    }
</select>

你显然可以根据需要添加属性......

答案 1 :(得分:2)

默认情况下,没有。 SelectListItem不包含任何其他属性来添加属性。但是,您可以创建自己的DropDownList方法或DropDownListFor并使用自定义ListItemToOption创建自己的SelectListItem以添加自己的属性。

但这可能是矫枉过正的。

答案 2 :(得分:1)

我是这样做的:

我创建了自己的DropDownListFor:

    public static MvcHtmlString TheDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> listOfValues, string placeHolder)
    {
        var model = htmlHelper.ViewData.Model;
        var metaData = ModelMetadata .FromLambdaExpression(expression, htmlHelper.ViewData);

        var tb = new TagBuilder("select");

        if (listOfValues != null)
        {
            tb.MergeAttribute("id", metaData.PropertyName);
            tb.MergeAttribute("name", metaData.PropertyName);

            if (!string.IsNullOrEmpty(placeHolder))
            {
                var option = new TagBuilder("option");
                option.MergeAttribute("value", placeHolder);

                tb.InnerHtml += option.ToString();
            }

            foreach (var item in listOfValues)
            {
                var option = new TagBuilder("option");
                option.MergeAttribute("value", item.Value);

                var textNdata = item.Text.Split('|');

                option.InnerHtml = textNdata[0];

                if (textNdata.Length == 2)
                    option.MergeAttribute("data-name", textNdata[1]);

                if(item.Selected)
                    option.MergeAttribute("selected", "selected");

                tb.InnerHtml += option.ToString();
            }
        }

        return MvcHtmlString.Create(tb.ToString());
    }

然后我的SelectListItem List就像这样创建:

    public List<SelectListItem> EmployerList
    {
        get
        {
            return Employers.Select(x => new SelectListItem
            {
                Text = x.EAN + "|" + x.Name,
                Value = x.Id.ToString(),
                Selected = (SelectedEmployer != null && SelectedEmployer.Id == x.Id)
            }).ToList();
        }
    }