2012-07-10 38 views
0

我正在将一些MVC页面添加到已存在的WebForms项目中。我想继续尽可能少地更改WebForms主页面/辅助方法。 WebForms项目使用asp:Menu来构建菜单导航,因此我制作了一个HTML助手方法,该方法动态构建相同的菜单,将控件呈现给包装StringBuilder的HtmlWriter,然后返回输出。将asp:菜单直接渲染到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有数据。我也尝试手动添加项目到菜单,但结果相同。

这可能是某种与菜单控件的Page属性没有被设置的问题?如果是这样,有没有办法将它伪造出来?

回答

1

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

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

+0

它似乎现在正在添加数据,但对RenderControl的调用抛出了NullReferenceException。 – 2012-07-10 12:02:41

+0

没关系,我能够创建一个假窗体,只是渲染,而不是:Dim fakeForm As New System.Web.UI.HtmlControls.HtmlForm()With { .Page = New System.Web.UI.Page() } fakeForm.Controls.Add(menuBuilder) – 2012-07-10 12:06:11