我有一个ASP.net UserControl
,要求包含页面包含对jquery的引用。
在过去,我只是在包含页面中包含对jQuery的引用:
<HEAD>
<SCRIPT type="text/javascript" src="Scripts/jquery-1.7.2.min.js"></SCRIPT>
</HEAD>
但我的UserControl对jQuery的依赖是一个内部实现细节,不应该泄漏到外面。我的userControl如何指示jQuery包含在最终页面中?
研究这个问题,我找到了很多困惑的解决方案,在不同的时间调用不同的函数。我不愿意提及任何,因为人们可能会认为它们中的任何一个都是有效的。我希望正确答案,而不是一个有效的答案。
不同的解决方案涉及:
this.Page.ClientScript.RegisterClientScriptInclude
during Render
this.Page.ClientScript.RegisterStartupScript
during Render
this.Page.ClientScript.RegisterStartupScript
during Page_Load
this.Page.ClientScript.RegisterStartupScript
during a button click Page.Header.Controls.Add(new LiteralControl( { Text = "<script type=\"text/javascript\" src=\"...\"></script>";);
<SCRIPT>
element in your userControl.ascx
file RegisterClientScriptBlock
during OnPreRender
我的困惑集中在:
RegisterClientScriptInclude
vs RegisterStartupScript
?Page_Load
vs Render
vs PreRender
期间与按钮点击进行调用?RegisterXxxxScriptXxx
提供"Scripts/jquery-1.7.2.min.js"
的路径?简短版:如何转换
<%@ Page Title="Home Page" Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
Inherits="_Default" %><!DOCTYPE html>
<html>
<head runat="server">
<script type="text/javascript" src="Scripts/jquery-1.7.2.min.js"></script>
用于UserControl:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="MySuperCoolControl.ascx.cs" Inherits="Controls_MySuperCoolControl" %>
答案 0 :(得分:3)
您可以按如下方式使用google hosted jquery:
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"></script>
答案 1 :(得分:2)
您可以在UserControl上使用ScriptManagerProxy
,在父页面或母版页上使用ScriptManager
。
请参阅How Do You Use ScriptManagerProxy In a custom ASP.NET Control
这将照顾“将RegisterXxxxScriptXxx提供给”Scripts / jquery-1.7.2.min.js“的路径,并且无需在Page_Load / Page_PreRender事件期间担心它。
至于“我什么时候想使用RegisterClientScriptInclude vs RegisterStartupScript?”
RegisterClientScriptInclude
注册要包含在页面中的外部JS文件。 RegisterStartupScript
在页面中包含一个内联可执行脚本块,该脚本不在外部文件中。
答案 2 :(得分:1)
[仅当您的用户控件在内部使用时才有用。如果是分发那么它将没有多大帮助]
看一下这个链接:
http://www.codeproject.com/Articles/196727/Managing-Your-JavaScript-Library-in-ASP-NET
本文建议创建生成javascript库引用的方法,例如jQuery,这样如果你想在页面中使用它,你只需调用JavascriptLoader.IncludeJQuery()[或者你称之为方法的任何东西]。
现在我所做的是通过在我放置在GAC中的程序集中创建这些方法,使其可用于我的所有.net Web应用程序,更进一步。现在,无论我想在哪里使用jQuery,该方法已经可用。最好的事情是,如果我在用户控件中调用该方法,并在另一个用户控件中再次调用它,并再次在页面上,它仍然只注册一次库。如果我决定升级到更新版本的jQuery,我只需更改我的dll,它随处可见。
答案 3 :(得分:0)
如果您的控件是从单独的项目引用的,则可以将javascript嵌入到另一个程序集中。看看斯科特·米切尔这个古老而又好的例子: