使用.net资源文件时候发生的问题
最近在做一个自定义控件,发生了一个问题,就是在OnPreRender()的时候,需要注册客户端脚本,往往会在控件里加一个属性,设置javascript文件*.js的路径,在使用控件时,页面有可能放到n层的目录底下,有的页面在最上层的目录底下,而每个页面都要修改一下路径,会很麻烦,所以我打算把js封装到dll中。
在custom control的class中,写一个BuildScriptCode()的方法,以下是代码
于是,在OnPreRender方法中,注册客户端js。
在custom control的class中,写一个BuildScriptCode()的方法,以下是代码
private string BuildScriptCode()
{
string result = string.Empty;
Stream stream = this.GetType().Assembly.GetManifestResourceStream("SMQControl.SMQControl.date.js");
//这里要说明一下,在"SMQControl.SMQControl.date.js"中,SMQControl.SMQControl.是改资源文件"date.js"的命名空间,这个一定要设置正确。
StreamReader sr = new StreamReader(stream);
try
{
result = sr.ReadToEnd();
}
catch
{
}
finally
{
sr.Close();
}
return result;
}
{
string result = string.Empty;
Stream stream = this.GetType().Assembly.GetManifestResourceStream("SMQControl.SMQControl.date.js");
//这里要说明一下,在"SMQControl.SMQControl.date.js"中,SMQControl.SMQControl.是改资源文件"date.js"的命名空间,这个一定要设置正确。
StreamReader sr = new StreamReader(stream);
try
{
result = sr.ReadToEnd();
}
catch
{
}
finally
{
sr.Close();
}
return result;
}
于是,在OnPreRender方法中,注册客户端js。
protected override void OnPreRender(EventArgs e)
{
if (!Page.IsClientScriptBlockRegistered("ShowDateWindow"))
{
Page.RegisterClientScriptBlock("ShowDateWindow","<SCRIPT language='javascript'>" + BuildScriptCode() +"</SCRIPT>");//调用BuildScriptCode()方法取得js代码。
}
this.Attributes.Add("onchange", string.Format("SetDateValues(document.getElementById('{0}'))", this.ClientID));
this.Attributes.Add("onclick", string.Format("LaunchCalendar(document.getElementById('{0}'), document.getElementById('{0}').value)", this.ClientID));
base.OnPreRender (e);
}
{
if (!Page.IsClientScriptBlockRegistered("ShowDateWindow"))
{
Page.RegisterClientScriptBlock("ShowDateWindow","<SCRIPT language='javascript'>" + BuildScriptCode() +"</SCRIPT>");//调用BuildScriptCode()方法取得js代码。
}
this.Attributes.Add("onchange", string.Format("SetDateValues(document.getElementById('{0}'))", this.ClientID));
this.Attributes.Add("onclick", string.Format("LaunchCalendar(document.getElementById('{0}'), document.getElementById('{0}').value)", this.ClientID));
base.OnPreRender (e);
}
还有一点值得注意的地方,就是项目里的date.js的资源文件,一定要在属性里设置Build Action为Embedded Resource,这样在编译的时候才能封装在dll中。
就是这样。