Javascript 同一页面上有更多ascx实例

Javascript 同一页面上有更多ascx实例,javascript,asp.net,user-controls,ascx,Javascript,Asp.net,User Controls,Ascx,我有一个asp.net ascx调用ProductSearch 在ascx中,我有以下4个控件 <asp:TextBox runat="server" ID="txtSearchProduct" type="text" class="form-control typeahead" data-provide="typeahead" autocomplete="off"> </asp:TextBox> <asp:TextBox runat="server" ID="tx

我有一个asp.net ascx调用ProductSearch

在ascx中,我有以下4个控件

<asp:TextBox runat="server" ID="txtSearchProduct" type="text" class="form-control typeahead" data-provide="typeahead" autocomplete="off">
</asp:TextBox>
<asp:TextBox runat="server" ID="txtProductNames" CssClass="hidden"> 
</asp:TextBox>
<asp:TextBox runat="server" ID="txtSearchProductID" Style="display: none;"> 
</asp:TextBox>
<asp:TextBox runat="server" ID="txtCaricati" Style="display: none;"> 
</asp:TextBox>

在这个ascx中,我有一个javascript函数,用所有可能的值填充typeahead文本框:

function LoadProducts() {
    var data = $("#<%=txtProductNames.ClientID%>").val();

    var $input = $(".typeahead");
    var jsonObj = $.parseJSON(data);
    var sourceArr = [];
    for (var i = 0; i < jsonObj.length; i++) {
        sourceArr.push(formatRow(jsonObj[i].id, jsonObj[i].code, jsonObj[i].name));
    }

    // init Typeahead
    $input.typeahead({
        ...
    }
函数加载产品(){
变量数据=$(“#”)val();
var$input=$(“.typeahead”);
var jsonObj=$.parseJSON(数据);
var sourceArr=[];
对于(var i=0;i
现在,问题是我有一个aspx页面,它需要实现两次ascx。 一个在主体div中,一个在模态div中(在模态不可见时被html隐藏)

使用F12工具浏览html时,我发现我有两次使用相同的函数LoadProducts()

在第一个函数中,函数使用它的ClientId对象,第二个也使用它

我从代码隐藏中调用函数LoadProducts(),然后执行代码中找到的第一个函数,可能是错误的

我需要一个方法来识别javascript函数,具体取决于我使用的是哪个ascx实例

有什么方法可以做到这一点吗?如果我还不够清楚,可以问我一些问题。

如果您不想要“全局”LoadProducts,这会更好,那么您需要使每个javascript函数都是唯一的。 为此,您可以使用用户控件本身的ID

所以你可以在ascx里做这个

<script>
    function LoadProducts_<%= this.ID %>() {
        alert('Products Loaded.')
    }

    LoadProducts_<%= this.ID %>();
</script>

我认为,即使在同一页上有数百个控件,您也只需要脚本一次。 试试这个。 将脚本移动到服务器端

**check if (!cs.IsClientScriptBlockRegistered(csType, csName))**
我想这是你的主管想要的

<%@ Page Language="C#"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
  public void Page_Load(Object sender, EventArgs e)
  {
    // Define the name and type of the client script on the page.
    String csName = "ButtonClickScript";
    Type csType = this.GetType();

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

    // Check to see if the client script is already registered.
    if (!cs.IsClientScriptBlockRegistered(csType, csName))
    {
      StringBuilder csText = new StringBuilder();
      csText.Append("<script type=\"text/javascript\"> function DoClick() {");
      csText.Append("Form1.Message.value='Text from client script.'; }");
      csText.Append("</script>");
      cs.RegisterClientScriptBlock(csType, csName, csText.ToString());
    }
  }
</script>
<html  >
  <head>
    <title>RegisterClientScriptBlock Example</title>
  </head>
  <body>
     <form id="Form1"
         runat="server">
        <input type="text" id="Message" /> <input type="button" value="ClickMe" onclick="DoClick()" />
     </form>
  </body>
</html>

公共无效页面加载(对象发送方,事件参数e)
{
//在页面上定义客户端脚本的名称和类型。
字符串csName=“ButtonClickScript”;
类型csType=this.GetType();
//从Page类获取ClientScriptManager引用。
ClientScriptManager cs=Page.ClientScript;
//检查客户端脚本是否已注册。
如果(!cs.IsClientScriptBlockRegistered(csType,csName))
{
StringBuilder csText=新建StringBuilder();
Append(“函数DoClick(){”);
追加(“Form1.Message.value='Text from client script.';}”);
csText.Append(“”);
RegisterClientScriptBlock(csType,csName,csText.ToString());
}
}
RegisterClientScriptBlock示例

您可以将
LoadProducts()
放置在ascx外部,并将其称为witj
LoadProducts(“”)
在ascxI内部需要在ascx内部调用它。我把这个ascx放在很多aspx中,我必须到处调用LoadProducts函数是的。但是只有一个ascx,所以你只需要更新一个用户控件。不是它的每个实例。
**check if (!cs.IsClientScriptBlockRegistered(csType, csName))**
<%@ Page Language="C#"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
  public void Page_Load(Object sender, EventArgs e)
  {
    // Define the name and type of the client script on the page.
    String csName = "ButtonClickScript";
    Type csType = this.GetType();

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

    // Check to see if the client script is already registered.
    if (!cs.IsClientScriptBlockRegistered(csType, csName))
    {
      StringBuilder csText = new StringBuilder();
      csText.Append("<script type=\"text/javascript\"> function DoClick() {");
      csText.Append("Form1.Message.value='Text from client script.'; }");
      csText.Append("</script>");
      cs.RegisterClientScriptBlock(csType, csName, csText.ToString());
    }
  }
</script>
<html  >
  <head>
    <title>RegisterClientScriptBlock Example</title>
  </head>
  <body>
     <form id="Form1"
         runat="server">
        <input type="text" id="Message" /> <input type="button" value="ClickMe" onclick="DoClick()" />
     </form>
  </body>
</html>