больше экземпляра ascx на той же странице - PullRequest
4 голосов
/ 03 июля 2019

У меня есть 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({
        ...
    }

Теперь проблема в том, что у меня есть страница aspx, которая должна реализовать ascx дважды.Один в главном div и один в модальном div (скрытый html, пока модальный не виден).

Изучение html с помощью инструмента F12 Я вижу, что у меня одна и та же функция LoadProducts () два раза.

В первом случае функция работает со своими объектами ClientId, а во втором тоже.

Я вызываю функцию LoadProducts () из кода, и первый, найденный внутри кода, выполняется, возможно, неправильный..

Мне нужен метод для определения функции javascript в зависимости от того, какой экземпляр ascx я использую.

Есть ли способ сделать это?Если я не был достаточно ясен, задавайте мне вопросы.

Ответы [ 2 ]

2 голосов
/ 10 июля 2019

Если вам не нужен «глобальный» LoadProducts, который был бы намного лучше, вам нужно сделать каждую функцию javascript уникальной. Для этого вы можете использовать идентификатор самого пользовательского элемента управления.

Так что вы можете сделать это внутри ascx

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

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

Так что, если у вас есть 2 пользовательских элемента управления, как это

<uc1:WebUserControl1 ID="WebUserControl1" runat="server" />
<uc1:WebUserControl1 ID="WebUserControl2" runat="server" />

У вас будут такие функции javascript

function LoadProducts_WebUserControl1() {

}
0 голосов
/ 11 июля 2019

Я думаю, вы просто хотите сценарий, даже если у вас есть сотни элементов управления на одной страницепопробуй это.Переместить скрипт на сервер

**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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...