Переопределить Html.DropDownListFor()
У меня есть таблица определения в Mysql. Это так просто, для. пример
GroupId Name
1 Colors
2 Size
DefinitionId GroupId Name
1 1 Black
2 1 Green
3 2 S
4 2 M
Я использую DropdownListFor. Я хочу создать пользовательский элемент управления, например DropDownList. Например:
Html.CustomDropDownList ("sizeId", 2) <--- 2 - группа размера.
Как я могу создать контроль, как это.
В конце возвращается, чтобы иметь что-то вроде этого.
<select Id="sizeId" name="sizeId">
<option value="3">M</option>
<option value="4">S</option>
</selec>
1 ответ
На самом деле это так просто.
//This overload is extension method accepts name, list and htmlAttributes as parameters.
public static MvcHtmlString DefinitionFor(this HtmlHelper helper, string name, int GroupId, object htmlAttributes)
{
// ref to db
var db = (Service.Interfaces.ISet<Definition>)
DependencyResolver.Current.GetService(typeof(Interfaces.ISet<Definition>));
//Creating a select element using TagBuilder class which will create a dropdown.
TagBuilder dropdown = new TagBuilder("select");
//Setting the name and id attribute with name parameter passed to this method.
dropdown.Attributes.Add("Key", name);
dropdown.Attributes.Add("Id", name);
//Created StringBuilder object to store option data fetched oen by one from list.
StringBuilder options = new StringBuilder();
//Get Item(s)
var items = db.Get(new Definition() { Group = new Group() { Id = GroupId } }).List;
foreach (var item in items)
{
//Each option represents a value in dropdown. For each element in the list, option element is created and appended to the stringBuilder object.
options = options.Append("<option value='" + item.Id + "'>" + item.Key + "</option>");
}
//assigned all the options to the dropdown using innerHTML property.
dropdown.InnerHtml = options.ToString();
//Assigning the attributes passed as a htmlAttributes object.
dropdown.MergeAttributes(new RouteValueDictionary(htmlAttributes));
//Returning the entire select or dropdown control in HTMLString format.
return MvcHtmlString.Create(dropdown.ToString(TagRenderMode.Normal));
}
Тогда я могу позвонить вот так.
<div>
@Html.DefinitionFor("colorId", 2, new { @class = "form-control" });
</div>
Удачного кодирования!