いくつかの MVC ページを既存の WebForms プロジェクトに追加しようとしています。WebForms マスター ページ/ヘルパー メソッドへの変更をできるだけ少なくしたいと考えています。WebForms プロジェクトは asp:Menu を使用してメニュー ナビゲーションを構築していたので、同じメニューを動的に構築し、コントロールを StringBuilder をラップする HtmlWriter にレンダリングし、出力を返す HTML ヘルパー メソッドを作成しました。
これが私のコードです:
<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 プロパティが設定されていないことによる何らかの問題でしょうか? もしそうなら、それを偽造する方法はありますか?