在用户控件中注册js以实现模块化的最佳方法
时间:2020-03-06 14:40:14 来源:igfitidea点击:
我有一个这样组织的控件
并且我想在调用主页面等上注册javascript,以便将该控件文件夹拖放到任何地方然后注册,它将知道如何找到js的URL。
这是我到目前为止(在用户控件中)
protected void Page_Load(object sender, EventArgs e) { if(!Page.IsClientScriptBlockRegistered("jqModal")) Page.ClientScript.RegisterClientScriptInclude("jqModal", ResolveClientUrl("~js/jqModal.js")); if (!Page.IsClientScriptBlockRegistered("jQuery")) Page.ClientScript.RegisterClientScriptInclude("jQuery", ResolveClientUrl("~/js/jQuery.js")); if (!Page.IsClientScriptBlockRegistered("tellAFriend")) Page.ClientScript.RegisterClientScriptInclude("tellAFriend", ResolveClientUrl("js/tellAFriend.js")); }
有任何想法吗?
解决方案
我们可以使用带有静态方法的帮助器类:
public static class PageHelper { public static void RegisterClientScriptIfNeeded( Page page, string key, string url ) { if( false == page.IsClientScriptBlockRegistered( key )) { page.ClientScript.RegisterClientScriptInclude( key , ResolveClientUrl( url )); } } }
或者我们可以在page / webcontrol / usercontrol的某个基类中具有类似的实例方法,这将执行相同的操作。
我看不到我们发布的图片。
我们也可以使用Context.Items来确保每个请求仅添加一次项目,并通过控件本身呈现javascript,尽管我认为registerclient脚本也很棒。
protected override void Render(HtmlTextWriter writer) { base.Render(writer); string[] items = new string[] { "jqModal", "jQuery", "tellAFriend" }; //Check if the Script has already been rendered during this request. foreach(string jsFile in items) { if (!Context.Items.Contain(sjsFile)) { //Specify that the Script has been rendered during this request. Context.Items.Add(jsFile,true); //Write the script to the page via the control writer.Write(string.Format(SCRIPTTAG, ResolveUrl(jsFile))); } } }