2008-12-02 40 views
3

尝试过这样的事情:的HttpModule - 得到的HTML内容或控件修改

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);  
运行这个时候

我得到“未将对象引用设置到对象的实例。”最后一行...

如何在原始文件的特定操作中插入两行文本(asp.net/html)? 我怎么弄出文件的扩展名(我只想申请这个aspx文件...?

+0

它是否为“p”给出空引用?处理程序不是一个页面? – 2008-12-02 08:02:34

+0

你还可以发布异常的堆栈跟踪吗?这可能有助于诊断问题。 – csgero 2008-12-02 08:42:51

+1

该代码不起作用,因为该页面对象在请求开始时不可用,请尝试使用PreRequestHandlerExecute代替 – haze4real 2010-06-04 14:37:28

回答

4

我不知道,但我不认为你可以使用HttpModule来改变Page的控制树(如果我错了,请纠正我)。然而,您可以修改HTML标记,但您必须为此编写一个“响应过滤器”。有关示例,请参阅http://aspnetresources.com/articles/HttpFilters.aspx或Google for“httpmodule response filter ”

+0

对于控制树问题,您可能是完全正确的,这就是我对该主题的无知。我会看看http过滤器的东西 – noesgard 2008-12-02 08:43:56

0

目前已在比IIS6或5你怎么写的HttpModules在IIS7一些变化,所以它可能是我的建议,如果你正在使用IIS7是无效的。

如果您当前使用的静态属性HttpContext可以获得对当前上下文的引用。 HttpContext类具有Request(HttpRequest类型)和Response(HttpResponse)两个属性,并且取决于您正在处理哪个事件(Application.EndRequest可能?),您可以对这些对象执行各种操作。

如果您想更改正在交付的页面的内容,您可能希望尽可能晚地做到这一点,因此对EndRequest事件的响应可能是最好的做法。

通过检查Request.Url属性(可能与System.IO.Path类一起)来检查请求的文件类型。试试这样:

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

修改内容比较困难。您可能可以在Context对象的其中一个事件中执行此操作,但我不确定。

一种可能的方法是编写自己的Cusom页面派生类,它将检查Context.Items集合中的值。如果找到了这个值,你可以为一个PlaceHolder对象添加一个标签,并将该标签的文本设置为你想要的。

像这样的东西应该工作:

下面的代码添加到一个HTTP模块派生类:

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"; 
    } 

} 

那你下面的类添加到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); 

    } 

} 

然后你可以像这样修改你的页面:

public partial class _Default : CustomPage 

请注意,继承已从System.Web.UI.Page更改为CustomPage。

最后,将PlaceHolder对象添加到您希望自定义内容的aspx文件中。

1

这似乎是HttpFilter解决方案是在这里做的伎俩:O)

如果我用了MOSS/.NET 2.x的+我可以使用符文版或刚添加我的标签在母版页.. 。

超级的建议和我的解决方案的测试后,我会接受miies.myopenid.com的解决方案,因为它似乎解决塔尔实际问题

6

其simplier比你想象:

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... 
     } 
    } 

如果PreRender事件不足,您可以在PreRequestHandlerExecute EventHandler中添加需要的任何事件...