【问题标题】:DropdownListFor default valueDropdownListFor 默认值
【发布时间】:2020-04-06 21:39:45
【问题描述】:

有没有一种简单的方法可以在 MVC 3 中向 DropDownListFor 添加“--请选择--”默认选项?

【问题讨论】:

    标签: asp.net-mvc-3


    【解决方案1】:

    所以,我做了这样的事情:

    @Html.DropDownListFor(model => model.Dessert, 
                          new SelectList(Model.AvailableDesserts, "DessertID", "DessertName"),
                          "---Select A Dessert ---")
    

    似乎工作得很好。 Dessert 在我的视图模型中是用户选择的。 AvailableDesserts 是可供选择的集合。希望对您有所帮助。

    【讨论】:

    • 这会在下拉列表顶部添加一个“--请选择--”,但默认为下拉列表中的下一项,至少在我的示例中:@Html.DropDownListFor(x => x.SelectedTeamID, new SelectList(Model.Teams, "TeamID", "TeamName"), "--请选择--")
    • 您发送到视图的 SelectedTeamID 的默认值是多少?在我的Create.cshtml 中,它将默认为“--- Select A Dessert ---”选项(ID 是一个整数,默认为 0),而在我的Edit.cshtml 中,它将默认为当前值的任何值model.Dessert 在我的视图模型中。这可能是因为我的 DessertIds 从 1 开始(我的 Desserts 表中的主键从 1 开始)。只是猜测,真的。我认为这就是发生这种情况的原因。
    • 我相信它所做的是查看模型字段的当前值,然后尝试默认选择该值。例如,如果当您构建视图模型(例如,对于 Create 调用)并将 SelectedTeamID 显式设置为 6 并将其传递给视图时,它将显示与 TeamID 6 关联的 TeamName,假设存在一个。
    • 我认为这个答案是不正确的。根据我的 IntelliSense,您作为字符串传递的DropDownListFor 的第三个参数应该是指定 HTML 属性的object,而不是默认值。如果你的默认为---Select A Dessert ---,那可能只是运气。
    • @Jez - 还有另一个重载允许字符串作为第三个参数。它添加了一个带有字符串的 null 选项作为显示文本,但它不会使其成为默认值。默认值将是构建模型的任何内容。只要“model.Dessert”属性可以为空,这个答案就可以工作,因为选项标签将是下拉列表中的空值。
    【解决方案2】:

    我在 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",""))
    

    【讨论】:

    • 我是 MVC 新手,您能告诉我如何将扩展方法添加到我的 SelectList 中吗?
    • 在你的项目中添加一个静态类,并将这些方法添加到其中。如果它不是全局项目命名空间,请确保您尝试从中调用它们的页面导入命名空间。 razor 中的语法是 @using Myproject.Extensions 或任何你给你的类命名的东西。更多参考请阅读:msdn.microsoft.com/en-us/library/bb383977.aspx
    • 我更喜欢您建议的 Helper/Extension 路线,但在实施时遇到了一些问题。我收到以下错误:Unable to cast object of type 'MyApp.UI.Models.Address' to type 'System.Web.Mvc.SelectListItem'. 我使用的代码是:@Html.DropDownListFor(m =&gt; m.EmailAddressID, new SelectList(Model.Addresses, "AddressID", "EmailAddress").PreAppend("---Select an Address---", "")) 它编译良好并在视图中被识别,但在运行时出现上述错误。 @itsmatt 提供的硬编码方法确实有效。我可能需要对扩展方法进行修改的任何想法?
    • 稳固!在选择列表选项没有硬编码的情况下效果很好。我的情况是我使用“IEnumerable”来保存选项,我修改了你的代码以适应这个
    【解决方案3】:

    你好,试试这个怎么样(如果你使用 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 =&gt; x).ToList() 之前是在 .Select(x =&gt; new SelectListItem 这不需要。
    【解决方案4】:

    我想将默认值设置为作为称为 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>
    

    我的下拉列表是网站类型列表。

    【讨论】:

      【解决方案5】:

      我喜欢下面的方法:

      @Html.DropDownListFor(m =&gt; 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。您可以在最后一个参数中更改您想要的任何引导类。

      这种方式允许您设置默认标签并在需要时指定标签的值。

      【讨论】:

        猜你喜欢
        • 2014-06-29
        • 1970-01-01
        • 2012-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-25
        • 2017-12-08
        相关资源
        最近更新 更多