none
求教ASP.NET 主题应用的问题 RRS feed

  • 问题

  • 当Page应用了Theme后,该页打开后会自动在Head标签中生成<Link href="对应主题的css地址" />的标签.

    因为某种原因,我需要人为的控制该自动生成出来的Link标签中的href属性值.

    求教可否通过继承什么类或者接口来完成这一目的?

    可有高人指点下,在Page的生命周期中的哪个环节FrameWork执行的生成指定主题所对应的css演示表Link标签也好.

    这样我就好继续研究下去了..

    2011年3月14日 15:44

全部回复

  •   <head>  <link id="MyStyleSheet" rel="stylesheet" type="text/css" runat="server" /></head>

         protected void Page_Load(object sender, EventArgs e)
            {
                //Page.Header.Attributes.Add("herf","aa.css");
                MyStyleSheet.Attributes["href"] = "aa.css";
            }

     


    http://blog.csdn.net/zx13525079024
    2011年3月15日 0:49
  • 这个Link标签是当配置了主题Theme后自动生成的!!! 不是我手动添加的!!
    2011年3月15日 7:27
  • 你在Page_PreInit事件里重新设置 Page.Theme="xx"即可啊
    【孟子E章】
    2011年3月16日 5:31
    版主
  • 我要改变的不是当前应用的Theme是哪个..

    而是应用了Theme后,在打开网页后的Html代码的Head标签里会因为应用了Theme而自动生成出来的Link标签...

     

    要改变的是这个Link标签的Href值...

     

    2011年3月17日 6:01
  • 你控制

    Page.StyleSheetTheme

    Page.Theme

    属性不就可以控制那个属性了吗?

    你也可以把它们设置为空,然后自己Page.Header.Controls.Add

     

     


    【孟子E章】
    2011年3月17日 6:06
    版主
  • 孟子朋友,呵呵,总是你回答我的问题,谢谢了..

    我的这个问题来源是因为URL重写..

    其实解决这个问题的方法有很多,比如我弄个HttpHandler来重写css文件的请求..

     

    写C#后台代码控制Page.Theme属性确实会 (改变) FrameWork生成客户端Html文档的Head标签中Link标签的Href属性.

    但没有解决我最终的问题,

    因为FrameWork自动生成出来的Link标签的Href="****.css",这个值是 相对路径!! 不是以 /(右斜杠) 开头的相对根路径的Href值表现方式

     

    另外自己写Page.Header.Controls.Add确实能做到..

     

    同时我也可以在Page的OnPreRender事件中写代码Foreach出Page.Header控件中所有的Link标签,然后人为的改变Href属性的值..

     

    但我因为考虑到性能问题,动态更换WEB系统皮肤架构等其他问题,想从FrameWork架构层来改变这个因为配置了Theme而自动生成出来的Link标签的Href属性值---即修改FrameWork该环节的代码,或者继承某类或接口,更改ASP.NET架构生成Html文档的流程来达到这个目的..

     

    我通过查找资料获得了ASP.NET架构生成Page的环节流程(即生成Html文档的流程).

     

    其中我找到了PageThemeBuildProvider这个类.

     

    在MSDN库中,有关于PageBuildProvider的介绍,也有关于BuildProvider架构更改的介绍.

    其部分文档为:

    <buildProviders>
    <add extension=".aspx" type="System.Web.Compilation.PageBuildProvider" />
    <add extension=".ascx" type="System.Web.Compilation.UserControlBuildProvider" />
    <add extension=".master" type="System.Web.Compilation.MasterPageBuildProvider" />
    <add extension=".asix" type="System.Web.Compilation.ImageGeneratorBuildProvider" />
    <add extension=".asmx" type="System.Web.Compilation.WebServiceBuildProvider" />
    <add extension=".ashx" type="System.Web.Compilation.WebHandlerBuildProvider" />
    <add extension=".soap" type="System.Web.Compilation.WebServiceBuildProvider" />
    <add extension=".resx" type="System.Web.Compilation.ResXBuildProvider" />
    <add extension=".resources" type="System.Web.Compilation.ResourcesBuildProvider" />
    <add extension=".wsdl" type="System.Web.Compilation.WsdlBuildProvider" />
    <add extension=".xsd" type="System.Web.Compilation.XsdBuildProvider"/>
    <add extension=".js" type="System.Web.Compilation.ForceCopyBuildProvider" />
    </buildProviders>

    但就是没有找到PageThemeBuildProvider类的介绍...

     

    我通过Reflector反编译查看System.Web.dll

     

    在System.Web.Compilation.PageThemeBuildProvider找到了..

    PageThemeBuildProvider类Reflector后的代码为如下:

     

    internal class PageThemeBuildProvider : BaseTemplateBuildProvider
    {
        // Fields
        private ArrayList _cssFileList;
        private IList _skinFileList;
        private VirtualPath _virtualDirPath;

        // Methods
        internal PageThemeBuildProvider(VirtualPath virtualDirPath)
        {
            this._virtualDirPath = virtualDirPath;
            base.SetVirtualPath(virtualDirPath);
        }

        internal void AddCssFile(VirtualPath virtualPath)
        {
            if (this._cssFileList == null)
            {
                this._cssFileList = new ArrayList();
            }
            this._cssFileList.Add(virtualPath.AppRelativeVirtualPathString);
        }

        internal void AddSkinFile(VirtualPath virtualPath)
        {
            if (this._skinFileList == null)
            {
                this._skinFileList = new StringCollection();
            }
            this._skinFileList.Add(virtualPath.VirtualPathString);
        }

        internal override BaseCodeDomTreeGenerator CreateCodeDomTreeGenerator(TemplateParser parser)
        {
            return new PageThemeCodeDomTreeGenerator((PageThemeParser) parser);
        }

        protected override TemplateParser CreateParser()
        {
            if (this._cssFileList != null)
            {
                this._cssFileList.Sort();
            }
            return new PageThemeParser(this._virtualDirPath, this._skinFileList, this._cssFileList);
        }

        // Properties
        internal virtual string AssemblyNamePrefix
        {
            get
            {
                return "App_Theme_";
            }
        }
    }

     
    其中的

        internal void AddCssFile(VirtualPath virtualPath)
        {
            if (this._cssFileList == null)
            {
                this._cssFileList = new ArrayList();
            }
            this._cssFileList.Add(virtualPath.AppRelativeVirtualPathString);
        }

    函数为重要的关键....

     

    BUT...BUT....

     

    从类到函数... 都是internal !!!!!!!!!

     

    请教孟子朋友..

    internal 类可否有办法重写!!

    或者internal 函数可否有办法覆盖!!!

    或者PageThemeBuildProvider这个类是在什么地方调用的!! 可否有办法通过Web.config的什么配置,替换掉PageThemeBuildProvide!!!

     

    为了这个问题,我研究得有点憔悴了...

    Microsoft的C#,FrameWork,真是越用越难受了.. 我去年要自定义Session架构最终也是这样,要逼得重写整个Page类,因为internal要被逼得重写整个System.Web.dll 库!

    代码不公开,框架里重要的代码不让继承,不让访问,不让调用,更要命的是不提供接口来自定义实现功能替换掉我不想要的FrameWork默认的类或函数...

    我真心想引用C#刚出来的时候国外某谁评论的一句话,C# 去其精华,留其糟糠的产物..

    2011年3月17日 7:49