所以我使用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”)
所以,我想首先是我班上的字符串翻译正确(如上所述)?如果是,为什么我在页面上看到字符串而不是实际的下拉?
谢谢!
答案 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")