【问题标题】:How to apply Bootstrap dropdown style to an ASP.NET MVC DropDownList?如何将 Bootstrap 下拉样式应用于 ASP.NET MVC DropDownList?
【发布时间】:2014-12-20 17:43:42
【问题描述】:

给出以下 MVC 剃须刀代码,它从列表中创建下拉列表:

@Html.DropDownList("MyTestList", null, new { @class = "btn btn-default dropdown-toggle" })

这将创建以下下拉列表:

使用 getbootstrap.com 的代码时:

<div class="dropdown">
    <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown">
        Dropdown
        <span class="caret"></span>
    </button>
    <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
        <li role="presentation"><a role="menuitem" tabindex="-1" href="#">test1</a></li>
        <li role="presentation"><a role="menuitem" tabindex="-1" href="#">test2</a></li>
    </ul>
</div>

它会像这样显示下拉菜单:

问题: 使用 @Html.DropDownList 时是否可以获得与使用 MVC 中的 HTML 代码时相同的外观和感觉?

【问题讨论】:

  • 类似于 Html.DropDownList 的扩展方法将有助于创建所需的 HTML 输出。
  • 我使用了相同的代码,但它不适用于我。我在 标记中包含引导程序并添加了以下代码: 你知道为什么吗?

标签: asp.net-mvc twitter-bootstrap


【解决方案1】:

这很有可能,而且非常容易。请阅读: DropDownList bootstrap styling

你只需要:

@Html.DropDownList("movieGenre", "All", new { @class = "form-control"})

@Html.DropDownListFor(model => model.MovieGenreModel, SelectList, new { @class = "form-control"})

【讨论】:

  • 我不同意。添加form-control 类将简单地创建一个本地的、半样式的下拉菜单,OP 说他想避免这种下拉菜单。我已经用一个工作示例更新了我的答案。
  • 如何用剃须刀创建下拉菜单?
  • 这很好用。请注意,如果您仅将 Html.EditorFor 更改为 Html,则预生成的代码可能类似于 @Html.EditorFor(model => model.MovieGenreModel, new { htmlAttributes = new { @class= "form-control" } })。 DropDownListFor 并放入您的 SelectList 它将不起作用。您还需要确保摆脱新的 { htmlAttributes 位。
【解决方案2】:

不可能使用 Razor 的 @Html.DropDownList() 方法来创建您提到的 Bootstrap 下拉菜单。虽然创建您自己的 HTML 帮助程序来呈现创建上述下拉菜单所需的代码很容易。

有很多教程和指南 (such as this one) 将引导您完成创建自定义 HTML 帮助程序的过程。它们实际上并不难创建,并且确实可以帮助您加快开发时间并鼓励代码重用。

更新:

鉴于此问题获得的关注度以及以下(不正确)答案获得的赞成票数量,这里有一个过期已久(一年半!)的代码示例,其中包含用于展示差异的图像。

您可以将此代码复制并粘贴到您的解决方案中,它应该可以工作。

代码:

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();
    }
}

用法:

@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>

}

【讨论】:

  • 我总是尽可能地尝试并包含一个代码示例,但是在这种情况下我时间紧迫。如果代码示例可以帮助您,那么我很乐意将一个代码示例放在一起并为您更新答案?
  • 老实说,我不介意点击链接并自己获取它,但我认为添加代码对其他人会有所帮助。
  • @ᴉʞuǝ 我已经更新了我的答案以提供代码示例。有点晚了,但迟到总比没有好!
  • 更好的是,如果您在编辑之后对此进行了一些不稳定的投票,那就是我,试图通过移动应用程序删除我的反对票,这给我带来了麻烦。现在 +1
  • 没问题,感谢您在我回答这么久后抽出时间删除您的反对票!
【解决方案3】:
@using (Html.BeginForm("Index", "ELibrary"))
{
@Html.DropDownListFor(m => m.Status, new SelectList(Model.StatusItems, "key", "value"), "-- Status --", new { onchange = "this.form.submit();", @class = "form-control" })
}

您只需添加 @class="form-control" 。它工作正常。但我也将它包含在 Html.Begin form();

【讨论】:

    【解决方案4】:

    对于寻找 .Net 核心实现的人,我在此处调整了 Joseph Woodward's answer

    public class BootstrapHtml
    {
        public static HtmlString 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.Append(" " + label);
            button.InnerHtml.AppendHtml(BuildCaret());
    
            //button.InnerHtml += " " + BuildCaret();
    
            var wrapper = new TagBuilder("div");
            wrapper.AddCssClass("dropdown");
    
            wrapper.InnerHtml.AppendHtml(button);
            wrapper.InnerHtml.AppendHtml(BuildDropdown(id, selectListItems));
    
            //wrapper.InnerHtml += button;
            //wrapper.InnerHtml += BuildDropdown(id, selectListItems);
    
            using (var writer = new System.IO.StringWriter())
            {
                wrapper.WriteTo(writer, HtmlEncoder.Default);
                string asd = writer.ToString();
                return new HtmlString(writer.ToString());
            }
        }
    
        private static TagBuilder BuildCaret()
        {
            var caret = new TagBuilder("span");
            caret.AddCssClass("caret");
    
            return caret;
        }
    
        private static TagBuilder 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");
    
            foreach (var item in items)
            {
                list.InnerHtml.AppendHtml("<li role=\"presentation\">" + BuildListRow(item) + "</li>");
            }
            //items.ForEach(x => list.InnerHtml += "<li role=\"presentation\">" + BuildListRow(x) + "</li>");
    
            return list;
        }
    
        private static string BuildListRow(SelectListItem item)
        {
            var anchor = new TagBuilder("a")
            {
                Attributes =
                {
                    {"role", "menuitem"},
                    {"tabindex", "-1"},
                    {"href", item.Value}
                }
            };
            var span = new TagBuilder("span");
            span.InnerHtml.Append(item.Text);
            anchor.InnerHtml.AppendHtml(span);
            //anchor.SetInnerText(item.Text);
    
            using (var writer = new System.IO.StringWriter())
            {
                anchor.WriteTo(writer, HtmlEncoder.Default);
                string asd = writer.ToString();
                return writer.ToString();
            }
        }
    }
    

    【讨论】:

      【解决方案5】:

      试试这个代码:

        @Html.DropDownListFor(model => model.MovieGenreModel, SelectList,
                         new { @class = "form-control",aria_describedby="dropdownMenu1"})
      

      【讨论】:

        【解决方案6】:

        我有一个在 ASP.net MVC 中工作的引导按钮,其中包含我在当前工作地点使用的真实示例。

        <div class="dropdown" style="display:inline-block">
                    <button class="btn btn-warning dropdown-toggle" type="button" data-toggle="dropdown" value="@Model.Id"  runat="server"><span class="glyphicon glyphicon-user"></span> Assign <span class="caret"></span></button>
                    <ul class="dropdown-menu" onclick="location.href='@Url.Action("AssignTicket", "Home", new {AssignId = Model.Id })'">
                        @foreach (var user in (IEnumerable<SelectListItem>)ViewBag.User)
                        {
                            <li>@user.Text</li>
                        }
                    </ul>
        </div>
        

        View.user 直接从数据库中获取用户名。 天哪,这就是你们中的一些人正在寻找的东西。

        【讨论】:

          【解决方案7】:

          在 Logn Search 之后,我不得不使用 JQuery 来动态添加类属性,如下所示:

          $(document).ready(function(){
             $("select").last().addClass("form-control");
          });
          

          【讨论】:

            【解决方案8】:

            添加@class = "form-control" 不适用于@Html.DropDownListFor。话虽如此,您可以通过复制这些样式(例如通过开发人员工具)来镜像其他 "form-control" 输入的样式,然后将 @Html.DropDownListFor 包装在您提供 id 的 div 中(例如 #my-selector)。为div 的子设置样式,例如:#my-selector > select { ...normal bootstrap form-control styles}

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-16
              • 1970-01-01
              • 2017-08-09
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多