一直想做一些自定义控件,能进行一些UI上的验证.于是就需要使用到嵌入的JS文件.
找了一些资料,找了些例子,发现不行,首先把JS文 件设为嵌入资源是都有说的,
但[assembly: WebResource("SYJ0.dir0.js1.js", "application/x-javascript", PerformSubstitution = true)]中SYJ0的说明就不一样了.有的说是命名空间,有的说是项目名.都不是很正确.
原因分析:这些资料基本上所说都是建立的项目和命名空间相同.所以可能不会遇到问题.然而我建立的项目是不同的项目名.
如:我建立的控件库项目名为WebCtrls,然后修改了项目的默认命名空间为SYJ0.而在代码中的命名空间使用了SYJ...
(有点混乱).
所以使用网上找的一些例子就是运行不了,要么没反应,要么提示出错...
最后解决:
[assembly: WebResource("SYJ0.dir0.js1.js", "application/x-javascript", PerformSubstitution = true)]中SYJ0应该是项目属性窗口的那个默认命名空间名称.
后面跟JS文件的路径.如SYJ0.dir0.js1.js表示,默认命名空间SYJ0下面的dir0目录下的js1.js文件.
当然 this.Page.ClientScript.RegisterClientScriptResource(this.GetType(), "SYJ0.dir0.js1.js");这句也不要写错了.
请注意大小写,没有测试是否区分大小写,还是注意一下.
下面是一完整的控件库项目的例子:
[Class1.cs]
using System;
using System.Web.UI.WebControls;
using System.Web.UI;
[assembly: WebResource("SYJ0.JScript1.js", "application/x-javascript", PerformSubstitution = true)]
[assembly: WebResource("SYJ0.dir0.js1.js", "application/x-javascript", PerformSubstitution = true)]
namespace SYJ
{
public class STextBox : WebControl, INamingContainer
{
protected TextBox textBox = new TextBox();
protected override void OnPreRender(EventArgs e)
{
this.Page.ClientScript.RegisterClientScriptResource(this.GetType(), "SYJ0.JScript1.js");
this.Page.ClientScript.RegisterClientScriptResource(this.GetType(), "SYJ0.dir0.js1.js");
base.OnPreRender(e);
}
protected override void RenderContents(System.Web.UI.HtmlTextWriter writer)
{
this.textBox.Attributes.Add("id", this.ID);
this.textBox.Attributes.Add("onclick", "msg(this);showTime();");
this.textBox.RenderControl(writer);
}
}
}
// JScript1.js
function msg(obj)
{
alert("hello from web control s js file id["+obj.id+"]");
}
// dir0.js1.js
function showTime()
{
alert(new Date());
}
使用方法:
用VS2008建一个解决方案,建立一个默认WEB项目为WebApplication,再建一个库项目.
将库项目的Class1.cs内容换成如上的内容,再在项目下直接建立一个JScript.js文件,再直接建立一个文件夹dir0,在dir0建立一个js1.js文件,内容分别如上所述.
编译一下,然后转到WEB项目的ASPX页面中,此时打开工具箱,应该会显示出我们创建的自定义控件STextBox.直接拖一个到页面,CTRL+F5执行,点击输入框看效果.