要通过DropDownList 助手插入下拉列表选项,请构建List<SelectListItem> 或从预定义模型创建SelectList 构造函数:
// assume Model.Selecciones is an IEnumerable option list
@Html.DropDownListFor(model => model.aPracticar, "actividades", new SelectList(Model.Selecciones), new { @class="form-control" })
// assume Model.ListaSelecciones is a SelectListItem option list
@Html.DropDownListFor(model => model.aPracticar, "actividades", Model.ListaSelecciones, new { @class="form-control" })
它们都会大致翻译成 HTML,如下所示:
<select class="form-control" name="aPracticar">
<option value="Valor">Texto</option>
<!-- other option values -->
</select>
如果你想建立一个SelectListItem的列表:
Model.ListaSelecciones = new List<SelectListItem>();
lista.Add(new SelectListItem() { Text = "Texto", Value = "Valor" } // example for adding option item to drop down list
但是,如果您倾向于直接绑定选择列表项来查看,请首先在您的模型上提供文本值对。
从下拉列表中选择的值将在表单提交时自动插入到model.aPracticar 属性中。
附录:DropDownList 生成的选项标签默认不包含“id”属性。您需要使用类似于此的扩展选项标签属性制作自定义 HTML 助手:
public class ExtendedSelectListItem : SelectListItem
{
public Object htmlAttributes { get; set; }
}
public class CustomHtmlHelper
{
// taken from stackoverflow.com/a/7772354: requires by HTML helper to get model state
public static Object GetModelStateValue(HtmlHelper helper, String key, Type destinationType)
{
ModelState state;
if (helper.ViewData.ModelState.TryGetValue(key, out state))
{
if (state.Value != null)
{
return state.Value.ConvertTo(destinationType, CultureInfo.InvariantCulture);
}
}
return null;
}
// this part inspired from stackoverflow.com/a/7537628
public static MvcHtmlString DropDownListForId<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, IEnumerable<ExtendedSelectListItem> selectList, String optionLabel, Object htmlAttributes = null)
{
String name = ExpressionHelper.GetExpressionText(expression);
String fullName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
if (String.IsNullOrEmpty(fullName))
{
throw new ArgumentException("Name is undefined");
}
if (selectList == null)
{
throw new ArgumentException("Select list is empty");
}
Object defaultValue = GetModelStateValue(helper, fullName, typeof(String));
if (defaultValue == null)
{
defaultValue = helper.ViewData.Eval(fullName);
}
else
{
var defaultValues = new[] { defaultValue };
IEnumerable<String> listvalues = (from value in defaultValues select value.ToString();
var selectedValues = new HashSet<String>(listvalues, StringComparer.OrdinalIgnoreCase);
var newSelectList = new List<ExtendedSelectListItem>();
foreach (ExtendedSelectListItem item in selectList)
{
item.Selected = (item.Value != null) ? selectedValues.Contains(item.Value) : selectedValues.Contains(item.Text);
newSelectList.Add(item);
}
selectList = newSelectList;
}
var listItems = new StringBuilder();
foreach (ExtendedSelectListItem item in selectList)
{
listItems.Append(ListItemToOption(item));
}
var tagBuilder = new TagBuilder("select")
{
InnerHtml = listItems.ToString()
};
tagBuilder.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
tagBuilder.MergeAttribute("name", fullName, true);
tagBuilder.GenerateId(fullName);
ModelState state;
if (helper.ViewData.ModelState.TryGetValue(fullName, out state))
{
if (state.Errors.Count > 0)
{
tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
}
}
tagBuilder.MergeAttributes(helper.GetUnobtrusiveValidationAttributes(name));
return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal));
}
public static String ListItemToOption(ExtendedSelectListItem item)
{
var builder = new TagBuilder("option")
{
InnerHtml = HttpUtility.HtmlEncode(item.Text)
};
if (item.Value != null)
{
builder.Attributes["value"] = item.Value;
builder.Attributes["id"] = item.Value;
}
if (item.Selected)
{
builder.Attributes["selected"] = "selected";
}
builder.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(item.htmlAttributes));
return builder.ToString(TagRenderMode.Normal);
}
}
请阅读https://msdn.microsoft.com/en-us/library/system.web.mvc.html.selectextensions.dropdownlist(v=vs.118).aspx以正确使用 DropDownListFor 模型绑定。