2

我正在创建一个 Page 对象并向其添加一个控件以用于打印目的。该代码有效,但是我找不到将样式表链接添加到标题的方法。在我粘贴的代码中,我尝试向标题添加链接,然后将标题控件添加到页面,但这会导致错误:

请求在此上下文中不可用 System.Web.UI.Page.get_Request() +8700216 System.Web.UI.HtmlControls.HtmlHead.RenderChildren(HtmlTextWriter writer) +83

    Function getControlHtml() As String
    Dim sw As New StringWriter
    Dim tw As New HtmlTextWriter(sw)

    Dim pg As New Page()
    pg.EnableEventValidation = False

    Dim cssLink As New HtmlLink
    cssLink.Href = "~/css/StyleSheet.css"
    cssLink.Attributes.Add("rel", "Stylesheet")
    cssLink.Attributes.Add("type", "text/css")        

    'works without this code
    Dim head As New HtmlHead
    head.Controls.Add(cssLink)
    pg.Controls.Add(head)

    Dim frm As New HtmlForm
    pg.Controls.Add(frm)
    frm.Attributes.Add("runat", "server")
    frm.Controls.Add(pnlMACForm)
    pg.DesignerInitialize()
    pg.RenderControl(tw) ' <--

    Return sw.ToString()
End Function
4

1 回答 1

1

您确实无法按照您的想法动态创建页面。您所做的只是创建 Page 对象,但您还没有通过 ASP.net 管道完成它。

这意味着 Page 对象尚未被设置为IHttpHandler请求的对象(因此尚未收到HttpApplication包含它需要的所有上下文对象的对象,例如RequestResponse),并且正在调用任何页面生命周期方法(例如RenderControl)失败。

ASP.Net webforms 没有将页面呈现为字符串的简单方法。不幸的是,创建一个“未附加的”页面对象并向其添加控件不会让您走得太远。如果您出于某种原因确实需要在页面生命周期之外渲染控件,您可以通过加载和渲染 .ascx 文件来实现,但这可能不足以满足您的需求。

我可以问一下您通过从这些控件获取 HTML 来尝试做什么吗?

于 2010-09-30T18:01:18.613 回答