если у меня есть что-то вроде этого:
@{
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?
Ответ 1 · рейтинг 5 · Justin Soliz
Я думаю, что наиболее практичным решением будет какой-нибудь 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>
вы, очевидно, могли бы добавить атрибуты по мере необходимости...
Ответ 2 · рейтинг 2 · Buildstarted
По умолчанию нет. SelectListItem не содержит никаких дополнительных свойств для добавления ваших атрибутов. Однако вы можете создать свой собственный метод DropDownList или DropDownListFor и создать свой собственный ListItemToOption с пользовательским SelectListItem для добавления собственных атрибутов.
Но наверное это перебор.
Ответ 3 · рейтинг 1 · Serj Sagan
Вот как я это сделал:
Я создал свой собственный 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();
}
}