Pergunta

Estou criando um objeto de página e adicionando um controle a ele para fins de impressão. O código funciona, no entanto, não consigo encontrar uma maneira de adicionar um link de folha de estilo ao cabeçalho. No código que colei, estou tentando adicionar um link ao cabeçalho e depois adicionar o controle do cabeçalho à página, mas isso causa um erro:

A solicitação não está disponível neste contexto System.web.ui.page.get_request () +8700216 System.web.ui.htmlcontrols.htmlhead.renderchildren (escritor htmltextwriter) +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
Foi útil?

Solução

Você realmente não pode criar uma página dinamicamente da maneira que está pensando. Tudo o que você está fazendo é criar o objeto da página, mas você não o fez através do pipeline do ASP.NET.

Isso significa que o objeto da página não foi definido como o IHttpHandler para o pedido (e consequentemente não recebeu um HttpApplication contendo todos os objetos de contexto de que precisa, como Request e Response) e chamando qualquer um dos métodos do ciclo de vida da página (como RenderControl) vão falhar.

O ASP.NET WebForms não tem uma maneira fácil de renderizar uma página em uma string. Criar um objeto de página "não ligado" e adicionar controles a ele, infelizmente, não o levará muito longe. Se você realmente precisa renderizar controles fora do ciclo de vida da página por algum motivo, você poderá fazer isso por Carregando e renderizando arquivos .ascx, mas isso pode não ser dinâmico o suficiente para suas necessidades.

Posso perguntar o que você está tentando fazer obtendo o HTML desses controles?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top