【问题标题】:Conflict JQuery function in the ASP.Net User ControlASP.Net 用户控件中的冲突 JQuery 函数
【发布时间】:2011-11-18 12:02:52
【问题描述】:

我有一个名为 MyControl 的用户控件。

并且在页面中使用了 3 次。所以,页面上有 3 个控件。

我在那个使用 ServerControl 的控件中编写了 jquery 函数,例如

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) {
            }
        });

    }

这就是我将它绑定到超链接控件的方式。

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

【问题讨论】:

  • 你是怎么调用函数的?
  • 您能否发布您的 3 个控件正在输出的 HTML。从它的声音来看,每个控件都有相同的 ID,这就是你遇到这个问题的原因。

标签: javascript jquery asp.net user-controls


【解决方案1】:

当您调用“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 id 并将其附加到函数名称,以便您创建一个独特的函数,但我不确定你怎么称呼它,所以这可能有帮助,也可能没有帮助。

编辑:

我现在对您的问题有了更多了解。我现在假设您单击三个控件中的哪一个,它总是执行它找到的第一个控件,所以它只是将数据重新加载到第一个控件中?

你的问题的症结在于两个方面:

  • 控件输出到页面的函数名称没有区别。
  • 如果 ajax 回调成功,我假设在页面上引用了多个 html 控件?

从您发布的 JQuery 函数中,我看不到为什么每次都需要将其粘贴到控件中,因为我没有看到任何服务器端变量输出?

我的建议是在所有控件都使用的父页面中创建一个函数。您明确声明由于服务器端变量而不能,但如果是这种情况,则修改您的 GetData() 函数以接受更多参数,以便这些参数定义它应该运行的上下文,而不是从它输出的控制来自。

可能将 controlid 作为参数传递给 jquery 函数,它也可以用作另一个选择器来查找相关的 html 控件以填充回调中的值。

多次输出一个函数会引发“我做得对吗?”这样的问题。而不是“我怎样才能让它工作?”。

【讨论】:

  • 很好解释。你说的对!!!我正在关注“我怎样才能让它工作?”而不是“我做得对吗?”。你向我展示了更好和正确的方法。非常感谢。
【解决方案2】:

为什么不添加一个参数来定义函数的调用位置?

【讨论】:

    【解决方案3】:

    如果您绝对不能移动该功能,那么类似:

    if (!MyFunction) {
       MyFunction = function(myName) {
           //some Ajax Call
    
           $("#<%= MyTextBox1.ClientID").val(DataFromAjax);
       }
    }
    

    【讨论】:

      【解决方案4】:

      您如何将脚本添加到您的控件中?我建议使用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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-10
        • 2011-05-15
        相关资源
        最近更新 更多