MVC DropDownList 外观和感觉

MVC DropDownList look and feel

所以我正在使用 MVC 创建一个站点,我的 DropDownLists 和 DropDownListFors 看起来与页面上的其他输入元素不一样。我尝试将它们的 class 设置为相同的 "form-control",甚至尝试在 css 中添加我自己的 class,它具有几乎相同的属性 "mydropdown"并使用它 - 都没有效果。

所以我发现 this very handy thread answered by Joseph Woodward 我刚刚尝试过....

我使用的是 VB 而不是 C#,所以我不得不翻译它。这是我翻译的 BootstrapHtml:

Public Class BootstrapHtml

    Public Function Dropdown(id As String, selectListItems As List(Of SelectListItem), label As String) As MvcHtmlString

        Dim button = New TagBuilder("button")
        button.Attributes.Add("id", id)
        button.Attributes.Add("type", "button")
        button.Attributes.Add("data-toggle", "dropdown")

        button.AddCssClass("btn")
        button.AddCssClass("btn-default")
        button.AddCssClass("dropdown-toggle")

        button.SetInnerText(label)
        button.InnerHtml += " " + BuildCaret()

        Dim wrapper = New TagBuilder("div")
        wrapper.AddCssClass("dropdown")
        wrapper.InnerHtml += button.ToString
        wrapper.InnerHtml += BuildDropdown(id, selectListItems)

        Return New MvcHtmlString(wrapper.ToString)

    End Function

    Private Function BuildCaret() As String

        Dim caret = New TagBuilder("span")
        caret.AddCssClass("caret")

        Return caret.ToString

    End Function

    Private Function BuildDropdown(id As String, items As IEnumerable(Of SelectListItem)) As String

        Dim list = New TagBuilder("ul")
        list.Attributes.Add("class", "dropdown-menu")
        list.Attributes.Add("role", "menu")
        list.Attributes.Add("aria-labelledby", id)

        Dim listItem = New TagBuilder("li")
        listItem.Attributes.Add("role", "presentation")

        For Each x In items
            list.InnerHtml += "<li role=\presentation\>" & BuildListRow(x) & "</li>"
        Next

        Return list.ToString

    End Function

    Private Function BuildListRow(item As SelectListItem) As String

        Dim anchor = New TagBuilder("a")
        anchor.Attributes.Add("role", "menuitem")
        anchor.Attributes.Add("tabindex", "-1")
        anchor.Attributes.Add("href", item.Value)

        anchor.SetInnerText(item.Text)
        Return anchor.ToString

    End Function

End Class

我不确定自己是否正确的一件事是 For Each 循环中的字符串连接....

无论如何,在我看来我尝试使用

@BootstrapHtml.Dropdown("typecombo", TypeList, "Dropdown")

但是它给了我一个代码错误:

Reference to a non-shared member requires an object reference.

所以我在顶部的代码部分添加了一个声明:

Dim newDropDown As BootstrapHtml = New BootstrapHtml

我在视图中的行现在如下所示:

@newDropDown = BootstrapHtml.Dropdown("typecombo", TypeList, "Dropdown")

所以现在我的网站运行没有错误,但是当我转到此页面时,我看到的不是下拉列表,而是字符串,它是这样的:

[myproject].BootstrapHtml = BootstrapHtml.Dropdown("typecombo", TypeList, "Dropdown")

那么,我想首先我的 class 中的字符串翻译是否正确(如上所述)?如果是,为什么我在页面上看到的是字符串而不是实际的下拉菜单?

谢谢!!

基于链接 post,Dropdown 方法应该是静态的。在 Vb.Net 中是 Shared 关键字,即

Public Class BootstrapHtml

    Public Shared Function Dropdown(id As String, selectListItems As List(Of SelectListItem), label As String) As MvcHtmlString
        '''other code removed for brevity
    End Function

End Class

实际上,class中的所有功能都应该共享。这就是导致您提到的引用错误的原因。

这样您就可以像示例中那样调用它了。

@BootstrapHtml.Dropdown("typecombo", TypeList, "Dropdown")