Non è possibile utilizzare il metodo @Html.DropDownList()
di Razor per creare il menu a discesa Bootstrap che hai menzionato. Anche se è abbastanza facile creare il proprio helper HTML che rende il codice necessario per creare il dropdown di cui sopra.
Ci sono un sacco di tutorial e guide (such as this one) che ti guideranno attraverso il processo di creazione di un helper HTML personalizzato. Non sono così difficili da creare e possono davvero aiutare ad accelerare i tempi di sviluppo e incoraggiare il riutilizzo del codice.
Aggiornamento:
data la quantità di attenzione a questa domanda sta ottenendo un numero di upvotes del (non corretti) risposta qui sotto è sempre, ecco un lungo tempo (un anno e mezzo!) Esempio di codice con un'immagine per dimostrare le differenze.
È possibile copiare e incollare questo codice nella soluzione e dovrebbe funzionare.
Il codice:
public class BootstrapHtml
{
public static MvcHtmlString Dropdown(string id, List<SelectListItem> selectListItems, string label)
{
var button = new TagBuilder("button")
{
Attributes =
{
{"id", id},
{"type", "button"},
{"data-toggle", "dropdown"}
}
};
button.AddCssClass("btn");
button.AddCssClass("btn-default");
button.AddCssClass("dropdown-toggle");
button.SetInnerText(label);
button.InnerHtml += " " + BuildCaret();
var wrapper = new TagBuilder("div");
wrapper.AddCssClass("dropdown");
wrapper.InnerHtml += button;
wrapper.InnerHtml += BuildDropdown(id, selectListItems);
return new MvcHtmlString(wrapper.ToString());
}
private static string BuildCaret()
{
var caret = new TagBuilder("span");
caret.AddCssClass("caret");
return caret.ToString();
}
private static string BuildDropdown(string id, IEnumerable<SelectListItem> items)
{
var list = new TagBuilder("ul")
{
Attributes =
{
{"class", "dropdown-menu"},
{"role", "menu"},
{"aria-labelledby", id}
}
};
var listItem = new TagBuilder("li");
listItem.Attributes.Add("role", "presentation");
items.ForEach(x => list.InnerHtml += "<li role=\"presentation\">" + BuildListRow(x) + "</li>");
return list.ToString();
}
private static string BuildListRow(SelectListItem item)
{
var anchor = new TagBuilder("a")
{
Attributes =
{
{"role", "menuitem"},
{"tabindex", "-1"},
{"href", item.Value}
}
};
anchor.SetInnerText(item.Text);
return anchor.ToString();
}
}
Usage:
@using (Html.BeginForm("", "", FormMethod.Post))
{
var items = new List<SelectListItem>()
{
new SelectListItem() { Text = "Item 1", Value = "#" },
new SelectListItem() { Text = "Item 2", Value = "#" },
};
<div class="form-group">
@Html.Label("Before", new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.DropDownList("Name", items, "Dropdown", new { @class = "form-control"})
</div>
</div>
<br/>
<br/>
<br/>
<div class="form-group">
@Html.Label("After", new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@BootstrapHtml.Dropdown("dropdownMenu1", items, "Dropdown")
</div>
</div>
}
Il metodo di estensione simile a Html.DropDownList consente di creare l'output HTML desiderato. – yW0K5o
Ho preso lo stesso codice e non funziona con me. Ho incluso il bootstrap nel tag
e ho aggiunto il seguente codice: