MVC DropDownList的外观和感觉

时间:2016-12-24 22:37:56

标签: asp.net-mvc vb.net razor html.dropdownlistfor

所以我使用MVC创建一个站点,而我的DropDownLists和DropDownListFors看起来与页面上的其他输入元素看起来不一样。我尝试将他们的类设置为相同的“表单控件”,甚至尝试在css中添加我自己的类,它具有几乎相同的属性,称为“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”)

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

  

对非共享成员的引用需要对象引用。

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

  

Dim newDropDown As BootstrapHtml = New BootstrapHtml

现在,我在视图中的界限如下:

  

@newDropDown = BootstrapHtml.Dropdown(“typecombo”,TypeList,   “下拉”)

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

  

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

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

谢谢!

1 个答案:

答案 0 :(得分:4)

基于链接的帖子,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

实际上,应该共享该类中的所有功能。这就是你提到的引用错误的原因。

然后你可以像在例子中一样调用它。

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