2012-05-20 2 views
3

В MVC я построил таблицу в представлении, перейдя по «списку» модели просмотра.не может удалить более одной строки таблицы, не обновляя страницу

@foreach(var item in Model) 
{ 
<tr id="[email protected]"> 
    <td> 
     @item.type 
    </td> 
    <td > 
     @Html.ActionLink((string)item.name, "Download", "FileUpload", new { rout = item.rout, fileName = item.name }, null) 
    </td> 
    <td> 
     @item.size 
    </td> 
    <td> 
     <a href="#" id="delete-file" del-url="@item.delete_url">Delete</a> 
    </td> 
</tr> 

}

когда я загрузить страницу, я получаю список файлов, с ссылкой «Удалить» для каждого из них.

я реализовал с JQuery основной «удалить строку» метод:

$('#delete-file').click(function() { 
    var delUrl = $(this).attr('del-url'); 
    $.post(delUrl, null, removeRow(),'json') 
}); 

function removeRow() { 
    $($('#delete-file').closest('tr')).fadeOut('slow'); 
} 

Когда я нажимаю «удалить» на одном из файлов строк, он выполняет хорошо, но потом, если я нажимаю на другой (удалить), Ничего не произошло. На сервере не удаляется файл, и строка не удаляется, как если бы он полностью игнорировался.

+0

У вас есть ошибки в js. Анонимная функция не закрыта, и линия не заканчивается. http://jsfiddle.net/7Z4C4/ – jurgemaister

+0

Я рекомендую использовать 'data-del-url =" "' и использовать '.data ('del-url')'. Пользовательские атрибуты недействительны, как сейчас. – pimvdb

ответ

4

Вам необходимо использовать class="delete-file" вместо id="delete-file" - и, конечно же, соответствующий переключатель $(".delete-file").

Идентификаторы должны быть уникальными для каждого документа, а ваш код привязывает обработчик к первому элементу id="delete-file".

+0

tnks! Кстати, хотя это просто, как нужно отлаживать такие ситуации, как эти и jquery? –

4

Вот вам решение:

http://jsfiddle.net/irpm/enEAt/1/

Javascript является:

$('.delete-file').click(function(e) { 
    $(this).closest('tr').remove(); 
});​ 
+0

+1 для скрипки, он очень хорошо работает –

+0

@sergel Когда я обновляю страницу после удаления строки, она возвращается снова. Я хотел удалить строку из строки подряд. Как это возможно? – bShah

3

Вы должны предотвратить действие по умолчанию <a> элемента, и использовать правильные селекторы

$('.delete-file').click(function(e) { 
    e.preventDefault(); 
    var self=this, 
     delUrl = $(this).attr('del-url'); 
    $.post(delUrl, function() { 
     $(self).closest('tr').fadeOut('slow'); 
    },'json'); 
}); 
+0

Почему это важно? –

3

Эта строка:

$.post(delUrl, null, removeRow(),'json'); 

просто эквивалентно следующему:

$.post(delUrl, null, undefined, 'json'); 

в removeRow() функция ничего не возвращает. Изменить эту строку следующим образом:

$.post(delUrl, null, removeRow,'json'); //Without '()' after 'removeRow' 

И ваша removeRow функция не будет работать, как вы ожидали, я думаю. Эта функция скроет все строки, но вам нужно скрыть только тот, на который нажимается «delete-file». Поэтому вам нужно передать ссылку этой строки на функцию removeRow. Вот один из способов:

$('#delete-file').click(function() { 
    var delUrl = $(this).attr('del-url'); 
    var $row = $(this).closest('tr'); 
    $.post(delUrl, null, function(){ 
     removeRow($row); 
    },'json') 
}); 

function removeRow($row) { $row.fadeOut('slow'); } 
+0

+1 Дело в том, что 'removeRow' * ссылается на * функцию, а' removeRow() 'выполняет ее. Выполнение не желательно. Ссылка на это. – Tomalak

Смежные вопросы