自定义控件开发设计模式遇到问题:按这样在页面中引入CSS文件,
<link id="CSS_KEY" type="text/css" rel="stylesheet" href="MyToolButton.css" />
在设计器中属性窗口设置自定义控件样式后, 能在设计器中看到设置的样式效果.但按下面这种方式在自定义控件中引入CSS文件.
protected override void Render(HtmlTextWriter writer)
{
if (DesignMode)
{
string strCSSPath = Path.Combine(this.ClientPath, @"Default\CSS\ToolButton.css");
if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "ToolButtonCSS"))
{
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "ToolButtonCSS",
"<LINK REL='stylesheet' TYPE='text/css' HREF='" + strCSSPath + "'></LINK>");
}
}
base.RenderContents(writer);
}
则在设计器属性窗口中设置自定义控件的CSS类属性时, 不能看到效果.注: 经过调试,第二中引入CSS文件方式(自定义控件中Rdner方法引入)语句确实执行了, Render方法在设计器和运行时都会执行.
现前提是用第二种引入CSS方式, 怎样才能够在设计器属性窗口设置CSS样式后,
能看到效果? 需要怎样设置?
<link id="CSS_KEY" type="text/css" rel="stylesheet" href="MyToolButton.css" />
在设计器中属性窗口设置自定义控件样式后, 能在设计器中看到设置的样式效果.但按下面这种方式在自定义控件中引入CSS文件.
protected override void Render(HtmlTextWriter writer)
{
if (DesignMode)
{
string strCSSPath = Path.Combine(this.ClientPath, @"Default\CSS\ToolButton.css");
if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "ToolButtonCSS"))
{
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "ToolButtonCSS",
"<LINK REL='stylesheet' TYPE='text/css' HREF='" + strCSSPath + "'></LINK>");
}
}
base.RenderContents(writer);
}
则在设计器属性窗口中设置自定义控件的CSS类属性时, 不能看到效果.注: 经过调试,第二中引入CSS文件方式(自定义控件中Rdner方法引入)语句确实执行了, Render方法在设计器和运行时都会执行.
现前提是用第二种引入CSS方式, 怎样才能够在设计器属性窗口设置CSS样式后,
能看到效果? 需要怎样设置?
你控件Render的时候才RegisterClientScriptBlock,实际上没写进去..
你试试RegisterStartupScript.我用2003,2005有没有什么不同不清楚,我想这个大概不会变吧..
试过了, 也是不行的.
另外说明一下, 虽然在设计器中不能够显示效果, 但运行时是没有问题的.
我想可能设计时不行是因为根本没有写入ClientScriptBlock/StartupScript,
不过这个我不能确认。你可以试试Register一段文本,可以看到的,
看设计时出来不?不出来应该就是没有写入..
运行时,Page的Form Render时调用Page的OnFormRender/OnFormPostRender写入ClientScriptBlock/StartupScript。
Page.Form是System.Web.UI.HtmlControls.HtmlForm类型, 这个的Designer是System.Web.UI.Design.HtmlIntrinsicControlDesigner,这里面没有找到任何调用了HtmlForm及其基类Render/RenderControl方法的地方。
设计时,Page.Form的Render没有执行,不写入ClientScriptBlock/StartupScript
一般注册引用文件资源如: js/css等是在PreRender事件中写的, 但PreRender在设计模式时不执行, Render中注册又"晚"了. 比较难办.有没有更好的办法?
运行时,控件Render方法里面RegisterClientScriptBlock会"晚",RegisterStartupScript还可以用。
设计时,这两种都是没用的,因为设计器根本不会写入注册script。
这种想想也是可以理解的,设计时并没有被设计Page的实例,他能表现出来无非是通过数据,就是html代码,模板(aspx文件)的与子控件Designer的GetDesignTimeHtml(?, 大概这个名称吧)得到的。
在控件Render中写RegisterStartupScript,这个是Page的方法(2003,你的有个ClientScript,不过我想相差不大),交给Page处理了,注册的script在控件生成html中没有任何痕迹。
设计时这个Page对象哪里来的我不清楚,可以确认的是可能不会是设计的这个页面。
也就是说Designer不知道有注册script,不能表现出来很正常。以上,要求设计时可以看到效果,我唯一想到的办法是控件生成html包含这个link,
也就是Render里面写成: writer.Write("<link ...");
具体有没有问题这个不清楚,习惯性会避免这种情况..