2011-03-08 8 views
7

Estoy tratando de inyectar js a la página (a etiquetas) usando ihttpmodule. pero js no está inyectado.Inyectar js desde IhttpModule

lo que hice:

la página:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="MyTempProject._Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head> 
    <title>Temp</title> 
</head> 
<body> 
    <form id="form1"> 
    <div> 

    </div> 
    </form> 
</body> 
</html> 

la IHttpModule:

public class MyExtensionModule : IHttpModule 
    { 
     #region IHttpModule Members 

     public void Dispose() 
     { 

     } 

     public void Init(HttpApplication context) 
     { 

      context.BeginRequest += new EventHandler(context_BeginRequest);    
     } 




     void context_BeginRequest(object sender, EventArgs e) 
     { 
      HttpContext context = ((HttpApplication)sender).Context; 
      Page page = HttpContext.Current.CurrentHandler as Page; 
      if (page != null) 
      { 
       string script = "/Scripts/jquery-1.5.1.js"; 
       if (page.Header != null) 
       { 
        string scriptTag = String.Format("<script language=\"javascript\" type=\"text/javascript\" src=\"{0}\"></script>\n", script); page.Header.Controls.Add(new LiteralControl(scriptTag)); 
       } 
       else if (!page.ClientScript.IsClientScriptIncludeRegistered(page.GetType(), script)) page.ClientScript.RegisterClientScriptInclude(page.GetType(), script, script); 
      } 


     } 

     #endregion 
    } 
+0

bueno, nunca va a ser agregado a la página. Cabezal porque eso no existe (basado en tu código). ¿Se está produciendo algo? ¿Has recorrido el código? ¿Estás recibiendo alguna excepción? – jonezy

+0

no, no hay ninguna excepción ... nunca se agrega la etiqueta ... así que ¿cómo puedo agregar etiquetas a la cabeza? ¿Tienes alguna idea? –

Respuesta

8

El evento BeginRequest es demasiado pronto para enganchar en una página. En ese punto del ciclo de solicitud, IIS/ASP.NET ni siquiera ha decidido asignar su solicitud a nada. Por lo tanto, probablemente debería probar algo como el evento PostMapRequestHandler.

Sin embargo, eso no es todo: en ese momento la página (si hay una) aún no se ha ejecutado. Eso sucede entre los eventos PreRequestHandlerExecute y PostRequestHandlerExecute. Entonces Pre ... es demasiado temprano, y Post ... es demasiado tarde. Su mejor opción es enganchar un evento de página como PreRenderComplete, y allí ejecutar su inyección.

public void Init(HttpApplication context) 
{ 
    context.PostMapRequestHandler += OnPostMapRequestHandler; 
} 

void OnPostMapRequestHandler(object sender, EventArgs e) 
{ 
    HttpContext context = ((HttpApplication)sender).Context; 
    Page page = HttpContext.Current.CurrentHandler as Page; 
    if (page != null) 
    { 
     page.PreRenderComplete += OnPreRenderComplete; 
    } 
} 

void OnPreRenderComplete(object sender, EventArgs e) 
{ 
    Page page = (Page) sender; 
    // script injection here 
} 

PRECAUCIÓN: Pocas personas todavía los utilizan, pero Server.Execute y Server.Transferno ejecutan ningún evento de tuberías. Por lo tanto, dichas solicitudes secundarias nunca se pueden detectar con un IHttpModule.

+0

Acabo de aprender algo hoy. ¿Hay algún equivalente a 'Server.Transfer' que ejecute eventos de canalización? –

+0

No es que yo sepa, no. – Ruben

+1

Gracias !!! Aprendí cosas nuevas sobre eso :) por ahora funcionó a la perfección. ¿Puedo usar Response.redirect en lugar de Server.Transfer? –

Cuestiones relacionadas