So I'm creating a site using MVC, and my DropDownLists and DropDownListFors do not look the same as the other input elements on the page. I tried setting their class to be the same "form-control", and even tried adding my own class in the css that has pretty much the same properties called "mydropdown" and using that - neither had an effect.
So I found this very handy thread answered by Joseph Woodward that I just tried....
I'm using VB instead of C# so I had to translate it. This is my translated 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
The one thing I'm not sure I got right was the string concatenation in the For Each loop....
In any case, in my view I tried using
@BootstrapHtml.Dropdown("typecombo", TypeList, "Dropdown")
but it gave me a code error:
Reference to a non-shared member requires an object reference.
So I added a declaration in the code section at the top:
Dim newDropDown As BootstrapHtml = New BootstrapHtml
And my line in the view now looks like this:
@newDropDown = BootstrapHtml.Dropdown("typecombo", TypeList, "Dropdown")
So now my site runs with no errors, however when I go to this page, instead of a dropdown list I am seeing the string, which is this:
[myproject].BootstrapHtml = BootstrapHtml.Dropdown("typecombo", TypeList, "Dropdown")
So, I guess first off is the string translation in my class correct (as mentioned above)? And if it is, why am I seeing the string on my page instead of an actual drop down?
Thank you!!