将asp:Menu直接渲染到HtmlWriter

时间:2012-07-10 11:52:51

标签: asp.net asp.net-mvc servercontrols

我正在将一些MVC页面添加到现有的WebForms项目中。我想继续尽可能少地更改WebForms母版页/辅助方法。 WebForms项目使用asp:Menu来构建菜单导航,因此我创建了一个HTML帮助方法,它动态地构建相同的菜单,将控件呈现给包装StringBuilder的HtmlWriter,然后返回输出。

这是我的代码:

    <Extension()> _
    Public Function RenderMenu(helper As HtmlHelper) As MvcHtmlString
        'Build menu with asp .net standard menu control
        Dim menuSource As New System.Web.UI.WebControls.SiteMapDataSource() With {
            .ShowStartingNode = False,
            .SiteMapProvider = "MySiteMapProvider"
        }

        Dim menuBuilder As New System.Web.UI.WebControls.Menu() With {
            .CssClass = "menu",
            .IncludeStyleBlock = "false",
            .Orientation = System.Web.UI.WebControls.Orientation.Horizontal,
            .StaticSubMenuIndent = New System.Web.UI.WebControls.Unit(20),
            .RenderingMode = System.Web.UI.WebControls.MenuRenderingMode.List,
            .DataSource = menuSource
        }
        menuBuilder.DynamicHoverStyle.BorderStyle = System.Web.UI.WebControls.BorderStyle.Dotted

        Dim buffer As New StringBuilder()
        Dim writer As New System.Web.UI.HtmlTextWriter(New StringWriter(buffer))

        menuBuilder.RenderControl(writer)

        'Convert rendered html to an mvc html string (to avoid re-encoding)
        Return New MvcHtmlString(buffer.ToString())
    End Function

麻烦的是,没有任何东西被渲染到我的HtmlWriter!我在调试器上完成了它并确认我的menuSource有数据。我也尝试手动将菜单添加到菜单中,但结果相同。

这可能是Menu控件的Page属性未设置的某种问题吗?如果是这样,有没有办法伪造它?

1 个答案:

答案 0 :(得分:1)

您没有在此代码示例的菜单上调用DataBind()来绑定所有数据并创建菜单项。添加对DataBind()的调用。

如果仍然不起作用,请读入文件并以编程方式创建菜单项。