Объект Javascript не определен, ошибка после ScriptManager.RegisterClientScriptInclude

У меня есть внешний файл js, который в основном является объектом js. Я использую метод ScriptManager.RegisterClientScriptInclude для включения файла на страницу, и после этого я использую метод ScriptManager.RegisterClientScriptBlock для вызова метода объекта js, но получаю ошибку js «DynamicLoadingPanel не определен». Я знаю, что вызов метода работает, когда он у меня есть на странице aspx, но я думаю, что получаю ошибку из-за времени, когда ScriptManager регистрирует блок сценария. В настоящее время у меня есть регистры в событии Page_Load, ниже мой код. Может кто-нибудь, пожалуйста, помогите мне понять, что здесь происходит. Спасибо.


Событие загрузки страницы

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.ClientScript.IsClientScriptIncludeRegistered("DynamicLoadingPanel"))
        {
            ScriptManager.RegisterClientScriptInclude(Page, typeof(Page), "DynamicLoadingPanel", "~/dynamicLoadingPanel.js");
            ScriptManager.RegisterClientScriptBlock(Page, typeof(Page), "set_LoadingPanelID", "DynamicLoadingPanel.set_loadingPanelID('modalLayer');", true);
        }
    }

person jhorton    schedule 22.02.2010    source источник
comment
Вы пытались использовать полный путь к источнику вместо ~/dynamicLoadingPanel.js? Кроме того, вы получаете обратный вызов на своей странице, когда что-то загружается? Возможно, вам нужно дождаться этого, прежде чем звонить по второй линии.   -  person NG.    schedule 23.02.2010
comment
Нет обратного вызова, и я удалил ~/ из URL-адреса, так как файл находится в той же папке, и все равно не повезло.   -  person jhorton    schedule 23.02.2010


Ответы (2)


После нескольких проб и ошибок я наконец нашел правильный способ включения внешнего файла js. Так что для всех тех, кто сталкивается с этой проблемой, я надеюсь, что это сэкономит вам пару разочаровывающих часов.

Чтобы включить ваш файл, вы должны получить объект текущего ScriptManager и добавить файл в коллекцию Scripts. Ниже приведен пример.


ScriptManager sm = ScriptManager.GetCurrent(Page);
ScriptReference sr = new ScriptReference("~/scripts/dynamicLoadingPanel.js");
if (!sm.Scripts.Contains(sr))
    sm.Scripts.Add(sr);
person jhorton    schedule 23.02.2010
comment
ОБНОВЛЕНИЕ. Если вам нужно зарегистрировать скрипт в приложении SharePoint, вам нужно будет использовать элемент управления ScriptLink и поместить скрипт в папку Layouts 1033. По крайней мере, это макет каталога для моего приложения, которое, как мне кажется, является OOB. Пожалуйста, не цитируйте меня по этому поводу. Надеюсь это поможет. - person jhorton; 24.02.2010
comment
Очень полезный ответ. Кроме того, убедитесь, что у вас есть ScriptManager на странице, иначе ваша переменная sm будет null. - person Brandon Montgomery; 13.06.2011
comment
Это очень помогло мне. У меня была функция javascript в пользовательском элементе управления, который находился на панели обновления, и каждый раз, когда вызывалась функция javascript, я получал исключение, что функция не найдена. Внедрение вашего решения сработало отлично! - person Aaron; 17.02.2012

или вы могли бы сделать что-то вроде этого...

        /// <summary>
        /// Binds the name of the script by.
        /// </summary>
        /// <param name="control">
        /// The control.
        /// </param>
        /// <param name="scriptName">
        /// Name of the script.
        /// </param>
        public static void BindScriptByName(this Control control, string scriptName)
        {
            if (control.Page == null)
            {
                return;
            }

            var sm = ScriptManager.GetCurrent(control.Page);
            if (sm == null)
            {
                return;
            }

            if (sm.Scripts.Count(s => s.Name == scriptName) == 0)
            {
                sm.Scripts.Add(new ScriptReference { Name = scriptName });
            }
        }

        /// <summary>
        /// Registers the script definitions.
        /// </summary>
        /// <remarks>
        /// Call this on Application_Startup in Global.asax.
        /// </remarks>
        public static void RegisterScriptDefinitions()
        {
            var jqueryScriptResDef = new ScriptResourceDefinition
            {
                Path = "~/Scripts/jquery-1.4.2.min.js",
                DebugPath = "~/Scripts/jquery-1.4.2.js",
                CdnPath = "http://ajax.microsoft.com/ajax/jQuery/jquery-1.4.2.min.js",
                CdnDebugPath = "http://ajax.microsoft.com/ajax/jQuery/jquery-1.4.2.js"
            };
            ScriptManager.ScriptResourceMapping.AddDefinition("jQuery", jqueryScriptResDef);

            var jquerySuperFishMenuScriptResDef = new ScriptResourceDefinition
            {
                Path = "~/Scripts/jquery.superfishmenu.js",
                DebugPath = "~/Scripts/jquery.superfishmenu.js",
                CdnPath = "~/Scripts/jquery.superfishmenu.js",
                CdnDebugPath = "~/Scripts/jquery.superfishmenu.js"
            };
            ScriptManager.ScriptResourceMapping.AddDefinition("jQuery.SuperFishMenu", jquerySuperFishMenuScriptResDef);

            var jqueryIdTabsScriptResDef = new ScriptResourceDefinition
            {
                Path = "~/Scripts/jquery.idTabs.min.js",
                DebugPath = "~/Scripts/jquery.idTabs.min.js",
                CdnPath = "~/Scripts/jquery.idTabs.min.js",
                CdnDebugPath = "~/Scripts/jquery.idTabs.min.js",
            };
            ScriptManager.ScriptResourceMapping.AddDefinition("jQuery.idTabs", jqueryIdTabsScriptResDef);
        }

Это позволяет вам вызывать RegisterScriptDefinitions в вашем Global.asax, а затем загружать их по имени... BindScriptByName("jQuery");

person Community    schedule 05.08.2010