如何确保js文件被包含在ascx文件中?

7
所以问题如下:
我有自己的用户控件,其中包含一些JavaScript文件,以以下方式在脚本标签中包含:
<script type="text/javascript" src="../somefile.js" ></script>

如果我直接在ascx页面上放置一些JavaScript代码,一切都能正常工作。但是,如果我将此控件动态添加到某个UpdatePanel占位符上进行回发(这是我无法改变的逻辑),控件会自行呈现,然后我会收到js错误消息,该消息指出在somefile.js中放置的函数未定义/为空。为什么会发生这种情况?在这种情况下是否有任何强制包含js的方法。
抱歉没有提供足够具体的信息,但代码量很大,我无法提供一个具有相同错误的简化示例。
脚本已经包含,但函数未被定义。我对js是新手,所以可能只是脚本被包含但未执行,因此函数未被声明?
有趣的是,如果在某个页面上声明我的自定义控件,则动态添加更多实例不会导致问题。
3个回答

17
在您的控件的 load 事件中,做如下操作:
if (!Page.ClientScript.IsClientScriptIncludeRegistered("keyName"))
    Page.ClientScript.RegisterClientScriptInclude("keyName",
        Page.ResolveUrl("~/Scripts/MyJavaScript.js"));

2
像这样将其包含在ScriptManager.Scripts中如何?
<asp:ScriptManager runat="server" ID="scriptManager1" EnablePageMethods="true">
        <Scripts>
            <asp:ScriptReference Path="~/somefile.js" />
        </Scripts>
</asp:ScriptManager>

编辑:

你可以从ascx中尝试像这样做(我会在OnPreRender中尝试这样做):

ScriptManager.GetCurrent(Page).Scripts.Add(new ScriptReference("~/somefile.js"));

另外,您可以尝试

 ScriptManager.GetCurrent(Page).RegisterClientScriptInclude(
            this,
            typeof(Page),
            "UniqueScriptKey",
            ResolveClientUrl("~/somefile.js"));

Reference link


我能以某种方式检索它吗?它在主页面上声明,而我无法修改。我已尝试通过aspx.cs文件中的ClientScriptManager注册该文件,但未成功。 - danyloid
我已经添加了另一种添加脚本的方法。请参见编辑。 - Bala R
还可以查看此 MSDN 页面中的示例。http://msdn.microsoft.com/us-en/library/system.web.ui.scriptreference.aspx - Bala R
1
很可能需要在ScriptManagerProxy中实现,因为只能有一个ScriptManager,而大多数人将其放在页面或主页面中。 - Brian Mains
ScriptManager.GetCurrent(Page) 获取对该页面可用的脚本管理器的引用(可能来自其主控页)。请参阅http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.getcurrent.aspx。 - Bala R

0
你确定你的JS文件正在加载吗?可能是文件不在正确的位置 - 不要在路径中使用 ../,因为这是相对路径,如果你正在共享文件并且页面的深度不同,可能会出错:
做一些像这样的事情:
<script type="text/javascript" src="/Scripts/somefile.js" ></script>

如果在aspx文件中声明了控件,JS文件将被加载。只有在某些postback时动态地将该控件添加到UpdatePanel内的某个PlaceHolder中才会遇到此问题。我还尝试直接将这些脚本包含在ascx文件中,但没有效果。 - danyloid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接