2010-02-23 4 views
6

У меня есть функция поиска в многопользовательском режиме на веб-пользовательском контроллере, который вызывается внутри ретранслятора, OHMY !!Автозаполнение jQuery на пользовательском контроллере в Repeater .NET.

У меня есть несколько учебных занятий, которые перечислены на странице, каждый из которых вызывает пользовательский пользовательский пользовательский контролер, чтобы люди могли искать сотрудников для добавления в учебную сессию. У меня есть идентификаторы сотрудников и идентификаторы сотрудников, перечисленные в JS на странице, и с использованием автозаполнения jQuery у меня есть поиск сотрудника и заполнение скрытого поля в пользовательском контроллере. Как только процесс будет выполнен, у них есть возможность добавить еще одного сотрудника.

Таким образом, у меня была работа Autocompelte во всех окнах поиска сотрудников, но я делаю автозаполнение начального поиска (обратной передачи), не будет работать снова.

Тогда я обновляемые $(). Готовы (функция() в Pageload(), так что корректно работает на нескольких запросов, но только в последнем пункте повторителя (Jquery загружается на контроллер пользователя)

FYI : Я строка JS установить в качестве EMPLOYEENAME | ID и JQuery отображает имя сотрудника и если они выбирают его бросает идентификатор в ASP: Скрытое поле

<script type="text/javascript"> 

    format_item = function(item, position, length) { 
     var str = item.toString().split("|", 2);   
     return str[0]; 
    } 

    function pageLoad() {  
     $("#<%=tb_EmployeeName.ClientID %>").autocomplete(EmployeeList, { 
      minChars: 0, 
      width: 500, 
      matchContains: true, 
      autoFill: false, 
      scrollHeight: 300, 
      scroll: true, 
      formatItem: format_item, 
      formatMatch: format_item, 
      formatResult: format_item 
     }); 
     $("#<%=tb_EmployeeName.ClientID %>").result(function(event, data, formatted) {     
      var str = data.toString().split("|", 2); 
      $("#<%=hf_EmployeeID.ClientID %>").val(str[1]); 
     }); 
    };  

    </script> 

я уже догадываюсь, что, повторяя Pageload в User Controll i переопределить предыдущую страницуLoad.

ВОПРОС: Есть ли способ обойти это, чтобы все jQuery отображались в одной странице Load или каким-то образом имели один вызов jquery для обработки всех моих полей поиска?

Я не могу переместить Jquery на страницу, призывающую все контроллеры, потому что у меня нет никакого способа ссылки на конкретное tb_EmployeeName текстового поля и hf_EmployeeID скрытого поля.

Огромное спасибо за любую помощь или прозрение, которые вы можете дать мне в этой проблеме.

Это Multiview, что на контроллере пользователя

 <asp:MultiView ID="mv_EmployeeArea" runat="server" ActiveViewIndex="0"> 

     <asp:View ID="vw_Search" runat="server">     
      <asp:Panel ID="eSearch" runat="server"> 
       <b>Signup Employee Search</b> (<i>Last Name, First Name</i>)<br /> 
       <asp:TextBox ID="tb_EmployeeName" class="EmployeeSearch" runat="server"></asp:TextBox> 
       <asp:HiddenField ID="hf_EmployeeID" runat="server" /> 

       <asp:Button ID="btn_Search" runat="server" Text="Search" /> 
      </asp:Panel>      
     </asp:View> 

     <asp:View ID="vw_Confirm" runat="server"> 
      <b>Signup Confirmation</b> 
      <asp:FormView ID="fv_EmployeeInfo" runat="server"> 
       <ItemTemplate> 
        <%#(Eval("LastName"))%>, <%#(Eval("FirstName"))%><br /> 
       </ItemTemplate> 
      </asp:FormView>  
      <asp:Button ID="btn_Confirm" runat="server" Text="Signup this employee" /> &nbsp; <asp:Button ID="btn_Reset3" runat="server" Text="Reset" /> 
     </asp:View> 

     <asp:View ID="vw_ThankYou" runat="server"> 
      <b>Thank You</b><br /> 
      The employee has been signed up and an email confirmation has been sent out.<br /><br /> 
      <asp:Button ID="btn_Reset" runat="server" Text="Reset" /> 
     </asp:View>    

    </asp:MultiView> 

------------ UPDATE -------------

Благодаря Nalum я смог решить проблему намного лучше, чем моя предыдущая (удаленная) попытка. Теперь у меня есть одна функция, которая обрабатывает все экземпляры для поиска, не создавая больше кода для каждого создаваемого поискового запроса.

На родительской странице, которая содержит ретранслятор, вызывается следующий javascript.

format_item = function(item, position, length) { 
    var str = item.toString().split("|", 2); 
    return str[0]; 
} 

function pageLoad() { 
    $(".ea_Autocomplete").each(function(i, element) { 

     var tb_EmployeeName = $(this).children('input[id*=tb_EmployeeName]:first') 
     var hf_EmployeeID = $(this).children('input[id*=hf_EmployeeID]:first') 

     tb_EmployeeName.autocomplete(EmployeeList, { 
      minChars: 0, 
      width: 500, 
      matchContains: true, 
      autoFill: false, 
      scrollHeight: 300, 
      scroll: true, 
      formatItem: format_item, 
      formatMatch: format_item, 
      formatResult: format_item 
     }); 

     tb_EmployeeName.result(function(event, data, formatted) { 
      var str = data.toString().split("|", 2); 
      hf_EmployeeID.val(str[1]); 
     }); 


    }); 
}; 

Я ничего в Multiview не изменится за оборачивать два входа в DIV с классом ea_Autocomplete

<asp:Panel ID="eSearch" runat="server"> 
       <b>Signup Employee Search</b> (<i>Last Name, First Name</i>)<br /> 
       <div class="ea_Autocomplete"> 
        <asp:TextBox ID="tb_EmployeeName" class="EmployeeSearch" runat="server"></asp:TextBox> 
        <asp:HiddenField ID="hf_EmployeeID" runat="server" /> 
       </div>                     

       <asp:Button ID="btn_Search" runat="server" Text="Search" /> 
    </asp:Panel> 

Еще раз спасибо Nalum!

ответ

2

Я как бы догадываюсь, я не знаю, как asp.net так поправьте меня, если я ошибаюсь.

Я предполагаю, что multiview делает какую-то вещь типа ajaxy на заднем плане asp.net, и в этом случае, когда ваша форма поиска перезагружается, jQuery.autocomplete не будет применяться к новой форме.

Скорее всего, я полностью ошибаюсь в том, что я только что сказал.


Редактировать мой второй комментарий.

$('.autocomplete').each(function(i,element){ 
    $(element).autocomplete({...}); 
    $(element).result(function(event, data, formatted) { 
     // Now based on you're element id you can build up an id and work with that 
     var id = element.id + '-extra-stuff';    
     var str = data.toString().split("|", 2); 
     $('#' + id).val(str[1]); 
    }); 
}); 
+0

Вы правы, обратная связь с jQuery. Заглянув в нее, я нашел информацию об использовании pageLoad() (см. Выше код), который отлично работал, когда у меня был только один экземпляр searchBox на странице. – TheDPQ

+0

Кажется, что вы получаете доступ к элементу формы по идентификатору, если каждый экземпляр окна поиска имеет тот же идентификатор, что и JavaScript, потому что идентификатор должен быть уникальным. Что делать, если вы измените код так, чтобы он получал поле ввода классом, что позволит использовать несколько полей автозаполнения. , например. '$ (". autocomplete "). autocomplete (EmployeeList' – Nalum

+0

Я изначально просто использовал cssclass, когда я впервые тестировал это. Однако есть недостатки, пытающиеся разделить строки имен и предполагая, где их первое/последнее имя останавливается и запускается Первые имена, такие как «Мэри Энн» или фамилии, такие как «Dela Cruz», означают, что все это произошло. Итак, я обновил его со скрытым полем, не требуя при этом лишнего поиска, чтобы получить идентификатор. ASP: HIDDEN FIELD не поддерживает атрибут cssclass, поэтому у меня нет способа заполнения скрытого поля EmployeeID после того, как они выбрали сотрудника из автозаполнения. – TheDPQ