Селектор jquery с префиксами

Это мой HTML-код:

<div id="editorRows">
  <div class="editorRow">
     <input type="hidden" value="01c4ed6d-1234-4951-b048-d86208636479" autocomplete="off" name="comds.index">
     Grupa:
     <select id="comds_01c4ed6d-1234-4951-b048-d86208636479__Grupa" name="comds[01c4ed6d-1234-4951-b048-d86208636479].Grupa">
     Produsul:
     <select id="comds_01c4ed6d-1234-4951-b048-d86208636479__Produs" name="comds[01c4ed6d-1234-4951-b048-d86208636479].Produs">
     Cantitate:
     <input id="comds_01c4ed6d-1234-4951-b048-d86208636479__Cantitate" type="text" value="0" name="comds[01c4ed6d-1234-4951-b048-d86208636479].Cantitate" data-val-required="The Cantitate field is required." data-val-number="The field Cantitate must be a number." data-val="true">
      Pret:
      <input id="comds_01c4ed6d-1234-4951-b048-d86208636479__Pret" type="text" value="17.23" size="4" name="comds[01c4ed6d-1234-4951-b048-d86208636479].Pret" data-val-required="The Pret field is required." data-val-number="The field Pret must be a number." data-val="true">
      TVA:
      <input id="comds_01c4ed6d-1234-4951-b048-d86208636479__TVA" type="text" value="0.24" name="comds[01c4ed6d-1234-4951-b048-d86208636479].TVA" data-val-required="The TVA field is required." data-val-number="The field TVA must be a number." data-val="true">
      Total:
      <input id="comds_01c4ed6d-1234-4951-b048-d86208636479__Total" type="text" value="0" name="comds[01c4ed6d-1234-4951-b048-d86208636479].Total" data-val-required="The Total field is required." data-val-number="The field Total must be a number." data-val="true">
      <a class="deleteRow" href="#">Sterge</a>
    </div>

    <div class="editorRow">
        <input type="hidden" value="97b4ac65-73f8-4339-a707-bad53763fb2e" autocomplete="off" name="comds.index">
        Grupa:
        <select id="comds_97b4ac65-73f8-4339-a707-bad53763fb2e__Grupa" name="comds[97b4ac65-73f8-4339-a707-bad53763fb2e].Grupa">
        Produsul:
        <select id="comds_97b4ac65-73f8-4339-a707-bad53763fb2e__Produs" name="comds[97b4ac65-73f8-4339-a707-bad53763fb2e].Produs">
        Cantitate:
        <input id="comds_97b4ac65-73f8-4339-a707-bad53763fb2e__Cantitate" type="text" value="0" name="comds[97b4ac65-73f8-4339-a707-bad53763fb2e].Cantitate">
        Pret:
        <input id="comds_97b4ac65-73f8-4339-a707-bad53763fb2e__Pret" type="text" value="17.23" size="4" name="comds[97b4ac65-73f8-4339-a707-bad53763fb2e].Pret">
        TVA:
        <input id="comds_97b4ac65-73f8-4339-a707-bad53763fb2e__TVA" type="text" value="0.24" name="comds[97b4ac65-73f8-4339-a707-bad53763fb2e].TVA">
        Total:
        <input id="comds_97b4ac65-73f8-4339-a707-bad53763fb2e__Total" type="text" value="0" name="comds[97b4ac65-73f8-4339-a707-bad53763fb2e].Total">
        <a class="deleteRow" href="#">Sterge</a>
      </div>
   <div class="editorRow">.....
</div>

Итак, я отображаю частичное представление, чтобы отобразить больше элементов, и у меня есть действие, чтобы создать больше. Я пытаюсь вызвать функцию Json, когда я изменяю значение в первом DropDownList для повторного заполнения второго. Это мой сценарий: ОБНОВЛЕНИЕ

             <script type="text/javascript">
            $(document).ready(function () {
            $('name$=.Grupa').change(function () {

                var url = '<%= Url.Content("~/") %>' + "Comenzi/ForProduse";
                var ddlsource = $(this);
                var ddltarget = $(this).siblings('[name$=.Produs]:first');
                $.getJSON(url, { id: $(ddlsource).val() }, function (data) {
                    $(ddltarget).empty();
                    $.each(data, function (index, optionData) {
                        $(ddltarget).append("<option value='" + optionData.Value + "'>" + optionData.Text + "</option>");
                        });

                    });
                });
            });
       </script>

Мой Json Action от контроллера не вызывается. Что я должен изменить в скрипте, чтобы работать? Спасибо!

2 ответа

Решение

Не уверен, что это единственная проблема, но я думаю, что селекторы, которые вы создаете, не то, что вы хотите сделать.

.editRow.Grupa

будет сопоставлять элемент с классом editRow и классом.Grupa

я думаю, что эта строка:

var ddlsource = '.editRow.Grupa';

должно быть просто должно быть $(this);
и ваш var ddlsource = '.editRow.Grupa';

должно быть что-то вроде var target = $(this).siblings('[name$=.Produs]:first');

а затем любой из них: $(ddltarget) должен быть целью вместо этого.

что-то вроде этого:

$(document).ready(function () {
         $('[name$=.Grupa]').change(function () {   //targets things with the name ending in .Grupa

            var url = '<%= Url.Content("~/") %>' + "Comenzi/ForProduse";
            var source =$(this); //this will be which ever one is changed
            var target = $(this).siblings('[name$=.Produs]:first');  //this SHOULD find the first select with a name ending in .Produs that is the sibling (same level in the dom to the changed select)
            $.getJSON(url, { id: source.val() }, function (data) {
                      target.empty();
                      $.each(data, function (index, optionData) {
                      target.append("<option value='" + optionData.Value + "'>" + optionData.Text + "</option>");

                  });

               });
            });
          });

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

Если только я не пропустил это $('.editRow.Grupa') не отображается ничего в вашем HTML. Это говорит о том, чтобы найти все элементы с классом editRow а также Grupa, У вас нет элементов с классом Grupa,

Посмотрите этот список селекторов для правильных способов выбора элементов:

http://api.jquery.com/category/selectors/

Ваш селектор будет закрыт, если вы измените его на $('.editRow .Grupa') и добавьте класс в ваш выбор группы, который Grupa,

Что это говорит, получить все элементы, которые находятся внутри элемента с классом editRow и иметь класс Grupa, Ваш селектор говорит, что вы хотите, чтобы все элементы, которые имеют оба класса editRow а также Grupa,

Другие вопросы по тегам