【发布时间】:2020-04-06 21:39:45
【问题描述】:
有没有一种简单的方法可以在 MVC 3 中向 DropDownListFor 添加“--请选择--”默认选项?
【问题讨论】:
标签: asp.net-mvc-3
有没有一种简单的方法可以在 MVC 3 中向 DropDownListFor 添加“--请选择--”默认选项?
【问题讨论】:
标签: asp.net-mvc-3
所以,我做了这样的事情:
@Html.DropDownListFor(model => model.Dessert,
new SelectList(Model.AvailableDesserts, "DessertID", "DessertName"),
"---Select A Dessert ---")
似乎工作得很好。 Dessert 在我的视图模型中是用户选择的。 AvailableDesserts 是可供选择的集合。希望对您有所帮助。
【讨论】:
Create.cshtml 中,它将默认为“--- Select A Dessert ---”选项(ID 是一个整数,默认为 0),而在我的Edit.cshtml 中,它将默认为当前值的任何值model.Dessert 在我的视图模型中。这可能是因为我的 DessertIds 从 1 开始(我的 Desserts 表中的主键从 1 开始)。只是猜测,真的。我认为这就是发生这种情况的原因。
DropDownListFor 的第三个参数应该是指定 HTML 属性的object,而不是默认值。如果你的默认为---Select A Dessert ---,那可能只是运气。
我在 SelectList 上有几个扩展方法
public static SelectList PreAppend(this SelectList list, string dataTextField, string selectedValue, bool selected=false)
{
var items = new List<SelectListItem>();
items.Add(new SelectListItem() { Selected = selected, Text = dataTextField, Value = selectedValue });
items.AddRange(list.Items.Cast<SelectListItem>().ToList());
return new SelectList(items, "Value", "Text");
}
public static SelectList Append(this SelectList list, string dataTextField, string selectedValue, bool selected=false)
{
var items = list.Items.Cast<SelectListItem>().ToList();
items.Add(new SelectListItem() { Selected = selected, Text = dataTextField, Value = selectedValue });
return new SelectList(items, "Value", "Text");
}
public static SelectList Default(this SelectList list,string DataTextField,string SelectedValue)
{
return list.PreAppend(DataTextField, SelectedValue, true);
}
那么我的剃须刀看起来像:
@Html.DropDownListFor(m=>m.SelectedState,
Model.StateList().Default("Select One",""))
【讨论】:
@using Myproject.Extensions 或任何你给你的类命名的东西。更多参考请阅读:msdn.microsoft.com/en-us/library/bb383977.aspx
Unable to cast object of type 'MyApp.UI.Models.Address' to type 'System.Web.Mvc.SelectListItem'. 我使用的代码是:@Html.DropDownListFor(m => m.EmailAddressID, new SelectList(Model.Addresses, "AddressID", "EmailAddress").PreAppend("---Select an Address---", "")) 它编译良好并在视图中被识别,但在运行时出现上述错误。 @itsmatt 提供的硬编码方法确实有效。我可能需要对扩展方法进行修改的任何想法?
你好,试试这个怎么样(如果你使用 DisplayFor 方法)
private IEnumerable<SelectListItem> AddDefaultOption(IEnumerable<SelectListItem> list, string dataTextField, string selectedValue)
{
var items = new List<SelectListItem>();
items.Add(new SelectListItem() { Text = dataTextField, Value = selectedValue});
items.AddRange(list);
return items;
}
然后只需将此代码添加到您的控制器中
//lambda expression binding
ViewBag.YourList = db.YourTable.Select(x => x).ToList().Select(x => new SelectListItem
{
Value = x.Id.ToString(),
Text = x.DisplayName.ToString()
});
ViewBag.YourList = AddDefaultOption(ViewBag.YourList, "Select One...", "null", true);
最后在视图中你可以显示一个下拉组合框,就像这样
<div class="editor-label">
Your Label
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.ForeignKey, (IEnumerable<SelectListItem>)ViewBag.YourList)
</div>
【讨论】:
.Select(x => x).ToList() 之前是在 .Select(x => new SelectListItem 这不需要。
我想将默认值设置为作为称为 SiteType 的 Url 参数传入的任何值:
<div class="form-group">
@Html.LabelFor(model => model.Type, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.Type, ChangeOrderSite.SiteTypeNames.Select(s => new SelectListItem { Text = s.Value, Value = s.Key.ToString(), Selected = s.Key.ToString() == Request["SiteType"] }), new { @class = "control-label col-md-2" })
@Html.ValidationMessageFor(model => model.Type)
</div>
</div>
我的下拉列表是网站类型列表。
【讨论】:
我喜欢下面的方法:
@Html.DropDownListFor(m => m.SelectedId, new SelectList(Model.Items, "Id", "Name"), new SelectListItem() { Text = "None", Value = "", Selected = true }.Text, new { @class = "form-control search-select-input btn btn-block btn-outline-secondary dropdown-toggle p-1" })
Items 是要在下拉列表中显示的类型的 IEnumerable。您可以在最后一个参数中更改您想要的任何引导类。
这种方式允许您设置默认标签并在需要时指定标签的值。
【讨论】: