Pergunta

tentou algo parecido com isto:

HttpApplication app = s as HttpApplication; //s is sender of the OnBeginRequest event
System.Web.UI.Page p = (System.Web.UI.Page)app.Context.Handler;
System.Web.UI.WebControls.Label lbl = new System.Web.UI.WebControls.Label();
lbl.Text = "TEST TEST TEST";
p.Controls.Add(lbl);    

Ao executar este eu recebo "Referência de objeto não definida para uma instância de um objeto." para a última linha ...

Como faço para chegar ao inserir duas linhas de texto (asp.net/html) em loactions específicas no arquivo original? E como faço para descobrir a extensão do arquivo (eu só deseja aplicar isso em arquivos aspx ...?

Foi útil?

Solução

Eu não tenho certeza, mas eu não acho que você pode usar um HttpModule para alterar a árvore de controle da página (por favor me corrijam se eu estiver errado). Você pode modificar a marcação HTML no entanto, você tem que escrever um "filtro de resposta" para isso. Para um exemplo, consulte http://aspnetresources.com/articles/HttpFilters.aspx , ou google para "HttpModule filtro de resposta".

Outras dicas

A sua simplier do que você pensa:

    public void Init(HttpApplication app)
    {
        app.PreRequestHandlerExecute += OnPreRequestHandlerExecute;
    }

    private void OnPreRequestHandlerExecute(object sender, EventArgs args)
    {
        HttpApplication app = sender as HttpApplication;
        if (app != null)
        {
            Page page = app.Context.Handler as Page;
            if (page != null)
            {
                page.PreRender += OnPreRender;
            }
        }
    }

    private void OnPreRender(object sender, EventArgs args)
    {
        Page page = sender as Page;
        if (page != null)
        {
            page.Controls.Clear(); // Or do whatever u want with ur page...
        }
    }

Se o evento PreRender não é suficiente u pode adicionar o que Evento u precisa no PreRequestHandlerExecute EventHandler ...

Parece que a solução HTTPFilter está fazendo o truque aqui: o)

Se eu tivesse usado MOSS / .net 2.x + Eu poderia ter usado Runes versão ou apenas acrescentado minhas marcas em uma página mestra ...

Super sugestões e depois do meu teste da solução, eu vou aceitar de miies.myopenid.com solução como parece para resolver thar questão real

Houve algumas mudanças na forma como você escreve HttpModules no IIS7 em comparação com IIS6 ou 5, por isso pode ser que a minha sugestão não é válido se você estiver usando IIS7.

Se você usar a propriedade estática atual do HttpContext você pode obter uma referência para o contexto atual. A classe HttpContext tem propriedades tanto para o Request (HttpRequest tipo) ea resposta (HttpResponse) e dependendo de onde qual evento você está lidando (Application.EndRequest talvez?), Você pode executar várias ações nesses objetos.

Se você quiser alterar o conteúdo do ser entregues página você provavelmente vai querer fazer isso tão tarde quanto possível, de modo a responder ao evento EndRequest é provavelmente o melhor lugar para fazer isso.

Verificar que tipo de arquivo que foi solicitado pode ser feito, verificando a propriedade Request.Url, talvez em conjunto com a classe System.IO.Path. Tente algo parecido com isto:

string requestPath = HttpContext.Current.Request.Url.AbsolutePath;
string extension = System.IO.Path.GetExtension(requestPath);
bool isAspx = extension.Equals(".aspx");

Modificando o conteúdo é mais difícil. Você pode ser capaz de fazê-lo em um dos eventos do objeto Context, mas eu não tenho certeza.

Uma abordagem possível poderia ser a escrever seu próprio cusom Página derivado classe que iria verificar para um valor na coleção Context.Items. Se este valor foi encontrado você pode adicionar um rótulo para um objeto de espaço reservado e definir o texto do rótulo para o que você queria.

Algo como isto deve funcionar:

Adicione o seguinte código para uma classe derivada HttpModule:

public void Init(HttpApplication context)
{
  context.BeginRequest += new EventHandler(BeginRequest);
}

void BeginRequest(object sender, EventArgs e)
{

  HttpContext context = HttpContext.Current;
  HttpRequest request = context.Request;

  string requestPath = HttpContext.Current.Request.Url.AbsolutePath;
  string extension = System.IO.Path.GetExtension(requestPath);
  bool isAspx = extension.Equals(".aspx");

  if (isAspx)
  {
    // Add whatever you need of custom logic for adding the content here
    context.Items["custom"] = "anything here";
  }

}

Em seguida, você adicionar a seguinte classe para a pasta App_Code:

public class CustomPage : System.Web.UI.Page
{
  public CustomPage()
  { }

  protected override void OnPreRender(EventArgs e)
  {
    base.OnPreRender(e);

    if (Context.Items["custom"] == null)
    {
      return;
    }

    PlaceHolder placeHolder = this.FindControl("pp") as PlaceHolder;
    if (placeHolder == null)
    {
      return;
    }

    Label addedContent = new Label();
    addedContent.Text = Context.Items["custom"].ToString();
    placeHolder .Controls.Add(addedContent);

  }

}

Em seguida, você modificar suas páginas como esta:

public partial class _Default : CustomPage

Note que a herança é alterada de System.Web.UI.Page para CustomPage.

E finalmente você adicionar PlaceHolder objetos a seus arquivos aspx sempre que você quiser, o conteúdo personalizado.

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