Внедрить JS из IhttpModule - PullRequest
7 голосов
/ 09 марта 2011

Я пытаюсь внедрить JS на страницу (в теги) с помощью ihttpmodule. но JS не вводится.

что я сделал:

страница:

<%@ 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>

Модуль ihttp:

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
    }

1 Ответ

8 голосов
/ 09 марта 2011

Событие BeginRequest слишком рано, чтобы зацепить страницу.На этом этапе цикла запросов IIS / ASP.NET даже не решил сопоставить ваш запрос с чем-либо.Поэтому вам, вероятно, следует попробовать что-то вроде события PostMapRequestHandler .

Однако это еще не все: в этот момент страница (если она есть) еще не выполнена.Это происходит прямо между событиями PreRequestHandlerExecute и PostRequestHandlerExecute .Так что Pre ... слишком рано, а Post ... слишком поздно.Лучше всего перехватить событие страницы, например PreRenderComplete , и выполнить инъекцию.

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
}

ВНИМАНИЕ: Мало кто все еще использует их, но Server.Execute и Server.Transfer не выполняют никаких событий конвейера .Таким образом, такие дочерние запросы никогда не могут быть перехвачены с помощью IHttpModule .

...