【问题标题】:MVC DropDownList look and feelMVC DropDownList 外观
【发布时间】:2016-12-25 09:21:47
【问题描述】:

所以我正在使用 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 = 新的 BootstrapHtml

我在视图中的行现在看起来像这样:

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

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

[myproject].BootstrapHtml = BootstrapHtml.Dropdown("typecombo", 类型列表,“下拉”)

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

谢谢!!

【问题讨论】:

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


    【解决方案1】:

    根据链接的帖子,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")
    

    【讨论】:

    • +1。不过稍微注意一下。对于 VB.NET,关键字是 Shared 而不是 Static。或者,如果所有方法都是静态的,则可以将 Class 制作成 ModuleThis 可能很有用。
    • 很高兴知道 C# 中的“静态”在 VB 中是“共享” - 谢谢@Jinx88909!
    猜你喜欢
    • 2011-10-20
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    相关资源
    最近更新 更多