как сбросить атрибут имени элемента управления вводом после действия jquery - PullRequest
0 голосов
/ 24 декабря 2009

У меня есть HTML-таблица внутри формы в виде asp.net MVC. Я также использую jQuery плагин TableSorter.

Вот код таблицы (упрощенно для примера)

 <table id=managersTable>
 <thead>
     <tr>
           <th>Manager</th><th>Remove</th>
     </tr>
 </thead>
 <tbody>
 <tr>
      <td>Manager 1<input type='hidden' name='updater.managers[0].Id' value=2313 /></td>
 <tr>
      <td>Manager 2<input type='hidden' name='updater.managers[1].Id' value=3233/></td>
      <td><input type='button' class=removeButtonManager value='Remove' name='remove' /></td>
 </tr>
 </tbody>

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

    $(document).ready(function() {
        $(".removeButtonManager").live("click", function(event) {
            var row = $(this).closest("tr").get(0);
            $(this).closest("tr").remove();
            $("#managersTable").trigger("update");
            $("#managersTable").trigger("appendCache");
        });
     });

Все отлично работает, кроме одного вопроса. Когда я нажимаю на кнопку «удалить», она удаляет строку, но проблема в том, что индекс для

name='updater.managers[0].Id'

выключен, и, похоже, в последней версии привязки mvc asp.net, если у вас нет индексированного свойства ваших элементов (0,1,2 и т. Д.), Оно не связывается.

, поэтому, если я никогда не удаляю строку, она отлично работает как ее 0,1,2 первоначально, но если я удаляю первую строку, то у меня есть только список (1,2..) И asp.net mvc не будут связывать этот объект.

поэтому я пытаюсь выяснить, как я могу сбросить индекс [] в каждом из элементов после удаления строки, поэтому независимо от удаления какой-либо строки, он всегда дает мне непрерывный список, начиная с 0.

Ответы [ 2 ]

1 голос
/ 24 декабря 2009

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

$(document).ready(function() {
    $(".removeButtonManager").live("click", function(event) {
        var row = $(this).closest("tr").get(0);
        $(this).closest("tr").remove();
        $("#managersTable").trigger("update");
        $("#managersTable").trigger("appendCache");
        $("#managersTable").find("input[type=hidden]").each(function(i){
           //this is the current input we're looping through
           //i is the index
           $(this).attr('name', 'updater.managers['+i+'].Id');
        });
    });
 });

Посмотрите документы для каждого (http://docs.jquery.com/Utilities/jQuery.each#objectcallback), если это не сработает сразу, я мог бы что-то перепутать. Надеюсь, это поможет

0 голосов
/ 22 апреля 2010

Также возможно добавить скрытое поле ввода, например

<input type='hidden' name='updater.managers.Index' value="0" />

для каждого списка, который публикуется обратно в связыватель модели в виде списка индексов в виде [0,2,3 ...]. И механизм связывания модели коллекции будет перебирать эти индексы вместо того, чтобы «пробовать» непрерывный индекс.

Значение поля .Index может быть числом или строкой.

Подробнее см. В последней части этого блога: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

...