我有一个类实现了IHttpModule接口.
想在里面实现对每个页面进行主题设置的功能,就像在每个页面里加
void Page_PreInit(object sender,EventArgs e)
{
  Theme="……";
}
这句话一样.但是在Void Init()方法里只能访问到HttpApplication对象,
我如何才能对本次请求的页面进行Theme属性设置呢?或者说如何通过HttpApplication对象访问到Page对象呢?
请大家指教.

解决方案 »

  1.   

    HttpContext.Current.CurrentHandler as Page
    如果是页面的话,这个Handler可以转换成Page,这就是当前页面的引用,然后就操作吧。
      

  2.   

    应该不行吧,IHttpModule 似乎太底层了,管不着高层的东西。
      

  3.   


    public class Page : TemplateControl, IHttpHandlerPage就是个Handler, 只要把CurrentHandler强制转换成Page,就可以操作当前的页面对象了,当然要求这个请求是让一个Page处理的
      

  4.   

    你的方法我试过了,强转成Page是空的。
    你看下我的代码:public class Themes : System.Web.UI.Page, System.Web.IHttpModule
        {
            #region IHttpModule 成员        void System.Web.IHttpModule.Init(HttpApplication context)
            {
                context.BeginRequest += new EventHandler(changeTheme);
            }
            #endregion       //改变整站主题
            private void changeTheme(object source, EventArgs e)
            {
                HttpContext context = ((HttpApplication)source).Context;
                Page page = context.CurrentHandler as Page;//page一直是为空
            }
      

  5.   

    不是每次请求的Handler都是一个Page,所以你要判断是否为空,不是空的才需要设置主题,其他的可能是取脚本资源的或其他Handler
      

  6.   

    做了个试验,发现要注意事件,否则handler是null的,因为还没初始化呢    protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
        {
            Page p = HttpContext.Current.CurrentHandler as Page;
            if (p != null)
            {
                p.Theme = "Default";
            }
        }
      

  7.   

    这个我知道,我就是加了断点一个个看的,都是空的啊。
    我随便打开一个.aspx的页面都不行啊。
    要不行你试试
      

  8.   

    你看看IHttpModule中事件执行的过程就知道了!!
      

  9.   

    事件我忽略了,用你的方法确实能获取Page对象,但是我获得的Page对象的Theme属性是空的。
    之前我已经在Web.config里设置了<pages theme="Winter">,这是问题1。还有一个问题是,我用你的方法给Page对象设置了值“Spring”但是这个页面还是没有应用这个主题,
    而是我之前在Web.config里设置的主题,这是怎么回事呢?
    还希望大家多帮忙啊!分不够可以再加.
      

  10.   

    是不是PreRequestHandlerExecute事件不对啊,应该用哪个呢?
      

  11.   

    要不就加在OnPrender之类的里面.
      

  12.   

    p.PreInit += new EventHandler(p_PreInit);绑个事件就行了。这样就可以保证变更主题的代码是在PreInit事件中执行的了