在CS中,如果是调试项目,在生成的HTML代码里会嵌入页面所使用的模板的类名及模板文件路径,但它是以HTML注释的方式体现出来的,我们要确定某个模块的信息还需要查看源文件并繁琐的检索,这里我们只需要稍微改造一下便能让这些注释更直观一眼就可以快速了解模块的相关信息。
让我们打开\src\Controls\BaseClasses\TemplatedWebControl.cs和\src\Controls\BaseClasses\SkinnedWebControl.cs这两个文件,这两个类是系统模板控件的基类,它们都有这样一个方法:
[System.Diagnostics.Conditional("DEBUG")]
protected void SourceMarker(bool isStart, HtmlTextWriter writer)
{
if(isStart)
{
writer.WriteLine("<!-- Start: {0} -->", this.GetType());
if(System.IO.File.Exists(HttpContext.Current.Server.MapPath(this.SkinPath)))
writer.WriteLine("<!-- Skin Path: {0} -->", this.SkinPath);
else if(SkinTemplate != null)
writer.WriteLine("<!-- Inline Skin: {0} -->", true);
else
writer.WriteLine("<!-- Skin Path: {0} -->", this.DefaultSkinPath);
}
else
writer.WriteLine("<!-- End: {0} -->", this.GetType());
}
这个方法的目的即是,在Debug编译环境下,控件输出的时候记录控件所属于的类名和控件所使用的skin路径,方便客户端通过HTML代码找到相应的代码进行修改,然而这里使用的是HTML注释,我们在查找的时候很不方便,那么我们把它转换成HTML隐藏的标签并在需要的时候让其制动显示在浏览器上不是更方便吗,这就进行改造,修改此方法如下:
SourceMarker
[System.Diagnostics.Conditional("DEBUG")]
protected void SourceMarker(bool isStart, HtmlTextWriter writer)
{
//Edit by lf
if(isStart)
{
writer.WriteLine("<span style='display:none;background-color:infobackground;' id='classInfo' name='classInfo'> Start: {0} </span>", this.GetType());
string skinPath = Globals.GetSkinPath() + "/Skins/" + SkinFilename.TrimStart('/');
if(System.IO.File.Exists(skinPath))
writer.WriteLine("<span style='display:none;background-color:infobackground;' id='skinInfo' name='skinInfo'> Skin Path: {0} </span>", skinPath);
else
writer.WriteLine("<span style='display:none;background-color:infobackground;' id='skinInfo' name='skinInfo'> Skin Path: {0} </span>", Globals.ApplicationPath + "/Themes/default/Skins/" + SkinFilename.TrimStart('/'));
}
else
writer.WriteLine("<span style='display:none;background-color:infobackground;' id='classInfo' name='classInfo'> End: {0} </span>", this.GetType());
}
聪明的你一定看出来了,这里其实很简单,只是把相应的HTML注释改为隐藏的span标签,对应的两个类文件都按照这样的方式进行修改即可。
修改了上述两个文件后还需要修改另外一个每页都需要的文件,这里我们选择\src\Controls\Utility\Footer.cs这个文件,因为这个脚标文件在每个页面都用得着,我们可以在这里设置一个开关让其通过点击自动显示和隐藏上面所修改的标签。
在Footer这个类的Render方法里把相应的writer.Writer方法改为如下所示样式,这样在Debug的时候就可以点击页脚的Skin、InSkin、Class三个连接来显示相应的Debug标签了。
Footer
#if DEBUG
writer.Write("© Copyright 2006 XXXXXX Corporation. All Rights Reserved. <span onclick='showDebugObj(\"skinInfo\")'>Skin</span> <span onclick='showDebugObj(\"inSkinInfo\")'>InSkin</span> <span onclick='showDebugObj(\"classInfo\")'>Class</span>");
writer.Write(@"<script language='javascript'>
function showDebugObj(n){
var objs = document.getElementsByName(n);
if(objs.length == 0) alert('Not Found:' + n);
for(i=0;i<objs.length;i++){
if(objs[i].style.display == 'none')
objs[i].style.display = '';
else
objs[i].style.display = 'none';
}
}
</script>
");
#else
writer.Write("© Copyright 2006 XXXXXX Corporation. All Rights Reserved.");
#endif
通过上面的改造我们可以在页脚看到三个标签:Skin、InSkin、Class当我们点击这三个标签的时候页面就会显示相应的控件的类名,Skin路径等信息,这在二次开发CS的过程中可以非常快速的定位到想修改的资源,节约大量的检索时间。希望对您有所帮助。