对RegisterClientScriptResource使用中的一点小问题探究了一下

进日在做一个小控件,在控件中要加入一个脚本资源,于是采用了了WebResource.axd这种办法。

按照MSDN中的说明依次设好了资源属性后,关键一步重写OnPreRender方法:


        
protected override void OnPreRender(EventArgs e) {

            
this.Page.ClientScript.RegisterClientScriptResource(typeof(PageBar), "JScript1.js");
            
base.OnPreRender(e);
        }

 接下来就是在View中使用控件,一切就绪后浏览页面,发现页面中根本没有出现下面的Html标签

<script src="/WebSite2/WebResource.axd?d=Dg388d1pcIkd_woITgUt8kFAs53-UOJCdkytxWPHRLM1&amp;t=633918896460000000" type="text/javascript"></script>
调试了半天还是出来不,没办法只好自己把这个Script标签生成出来:
html += string.Format("<script src='{0}' type='text/javascript'></script>",  this.Page.ClientScript.GetWebResourceUrl(typeof(PageBar), "JScript1.js"));

 这样效果是出来了,可是为什么RegisterClientScriptResource起不到作用,难道是在asp.net3.5中不能用了,应该不太可能。

 那么是不是在ASP.NET MVC中不能用呢,试着新建了一个普通的项目把控件往里一托,浏览页面,结果可以正常显示。

难道是在ASP.NET MVC中这个事件不起作用?但是回头一想不应该呀,微软不可能搓到留下这么一个BUG吧。

 那是什么原因呢?想到了Ajax的ScriptManager控件,于是在页面中加上了这个控件,再次浏览。

意外的报了一个关键性的小错:ScriptManager控件必须放在runat="server"的Form标签中。

没的说加上Form标签吧。再次浏览,OH YEAH,脚本终于被加载进来了。

那是不是不要ScriptManager控件也可以呢?再次实验了一下OK 。

最后得出结论:

原来RegisterClientScriptResource这一系列的方法都是需要一个runat="server"的Form标签。

这个问题的出现巧在做页面的时候不需要提交数据,为了减少页面中的HTML就偷了个懒,没加Form标签,结果出现了这个问题。

事实上对于这个页面来说的话form标签根本不需要,而RegisterClientScriptResource的目的无非就是在页面中加上<script>导入资源的标签,用 RegisterClientScriptResource这种办法和自己写代码拼html标签的方法我想后者的效率应该更高一些,生成的HTML标签垃圾也更少一些。

最后也想告诉一些初学者(其实我也算不上高手),遇到问题的时候一定要多实验,多思考,切忌只求一知半解, 赶项目的时候没时间可以放一放,但是有空余的时间要多想一想,少偷点菜比啥都强。


原文地址:https://www.cnblogs.com/hawkon/p/1588527.html