Конфликт JQuery функции в пользовательском элементе управления ASP.Net - PullRequest
2 голосов
/ 18 ноября 2011

У меня есть пользовательский элемент управления, который называется MyControl.

И он используется на странице 3 раза.Итак, на странице есть 3 элемента управления.

Я написал функцию jquery в этом элементе управления, который использовал ServerControl, например

function MyFunction(myName) {
    //some Ajax Call

    $("#<%= MyTextBox1.ClientID").val(DataFromAjax);
}

Проблема в том, что на странице есть 3 функции JQuery "MyFunction"и это смущает.Мой код выполняется успешно, если я использовал только 1 элемент управления на странице.Но если их больше одного, функция конфликтует с другими.

Я не могу переместить функцию из пользовательского элемента управления на страницу, поскольку она ссылается на некоторые серверные элементы управления в элементе управления.

Не могли бы вы посоветовать мне?Спасибо всем.

Это моя функция JQuery.

function GetData(ADUser) {

        $.ajax({
            url: "/Health/Health.asmx/GetPersonData",
            data: "{ 'samAccount': '" + ADUser + "' }",
            dataType: "json",
            type: "POST",
            contentType: "application/json; charset=utf-8",
            success: function (data) {
                var user = data.d;

                if (user != null) {

                    $("#cphContent_PersonalDetail1_txtFirstName").val(user.FirstName);
                    $("#cphContent_PersonalDetail1_txtLastName").val(user.LastName);
                    $("#cphContent_PersonalDetail1_txtTelephone").val(user.Telephone);
                    $("#cphContent_PersonalDetail1_txtEmail").val(user.Email);
                }
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
            }
        });

    }

Так я связал ее с элементом управления HyperLink.

if (!IsPostBack)
        {
            hlFill.Attributes.Add("onclick", string.Format("GetData('{0}'); return false;", GlobalSettings.UserADAccount));
}

Ответы [ 4 ]

2 голосов
/ 18 ноября 2011

Когда вы звоните «MyFunction», чего вы надеетесь достичь?Я имею в виду, что вы пытаетесь вызвать его так, чтобы каждая функция javascript в трех элементах управления, которые есть на странице, выполнялась одновременно, так что значение заполнялось в каждом элементе управления из обратного вызова Ajax.

Или вы пытаетесьвызывать определенную функцию в каждом элементе управления на основе определенных ограничений?

Каждый случай имеет свой ответ.Например, в первом случае это чисто теоретически, но когда вы объявляете MyFunction, вы можете постоянно создавать единственную функцию, например:

if(MyFunction != null)
{
    var oldFunction = MyFunction;
    MyFunction = new function(){ //new code here; oldFunction(); }

}
else
{
    //Create it as you were but assign it to MyFunctino
}

Если это последняя, ​​где вы хотите вызывать каждую MyFunction на основе определеннойограничения, есть ли вы в любом случае, например, взять идентификатор Asp Controls и добавить его к имени функции, чтобы вы создали уникальную функцию, но тогда я не уверен, как вы вызываете ее, так что это может или не может помочь.

Редактировать:

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

Суть вашей проблемыдва раза:

  • Нет различия между именем функции, которое ваши элементы управления выводят на страницу.
  • Элемент управления оценивает ваши настройки в вашей функции при успешном обратном вызове ajax. Я полагаю, что на странице указано более одного элемента управления html?

Из функции JQuery, которую вы разместили, яЯ не могу точно понять, почему вам нужно каждый раз вставлять это в элемент управления, так как я не вижу вывода серверной переменной?

Я бы предложил создать одну функцию на родительской странице, чтобы все вашиконтролирует использование.Вы явно заявляете, что не можете из-за серверных переменных, но если это так, измените функцию GetData () так, чтобы она принимала больше параметров, чтобы они определяли контекст, в котором она должна выполняться, а не из какого элемента управления она выводитсяfrom.

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

ВыводФункция несколько раз должна провоцировать вопрос "правильно ли я делаю?"а не «как я могу заставить это работать?».

0 голосов
/ 18 ноября 2011

Как вы добавляете скрипт в свой элемент управления? Я бы рекомендовал использовать ClientScriptManager.RegisterClientScriptBlock () . Вы можете указать ключ скрипта, чтобы он добавлялся на вашу страницу только один раз.

// Get a ClientScriptManager reference from the Page class.
ClientScriptManager cs = Page.ClientScript;

// Check to see if the startup script is already registered.
if (!cs.IsStartupScriptRegistered(cstype, csname1))
{
  String cstext1 = "alert('Hello World');";
  cs.RegisterStartupScript(cstype, csname1, cstext1, true);
}
0 голосов
/ 18 ноября 2011

Если вы абсолютно не можете переместить функцию, то что-то вроде:

if (!MyFunction) {
   MyFunction = function(myName) {
       //some Ajax Call

       $("#<%= MyTextBox1.ClientID").val(DataFromAjax);
   }
}
0 голосов
/ 18 ноября 2011

Почему бы вам просто не добавить параметр, который определяет откуда вызывается функция?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...