#jquery #asp.net-mvc #dynamic-controls
#jquery #asp.net-mvc #динамические элементы управления
Вопрос:
Я хочу отобразить список вложенных файлов (только имя файла), возможность добавлять новые вложения на странице СОЗДАНИЯ работает отлично. Я использую код из здесь, смотрите скриншот ниже..
public IList<string> Docs { get; set; }
<div class="form-group">
<label class="control-label" for="SelectedRDIMSdocs"><span class="field-name">RDIMS Document(s)</span> </label>
<div class="controls">
<div>
<div class="entry input-group col-xs-3">
<input class="form-control" name="SelectedRDIMSdocs" type="text" placeholder="#999999" />
<span class="input-group-btn">
<button class="btn btn-default btn-add" type="button">
<span class="glyphicon glyphicon-plus"></span>
</button>
</span>
</div>
</div>
</div>
</div>
<script>
$(function () {
$(document).on('click', '.btn-add', function (e) {
e.preventDefault();
var controlForm = $('.controls div:first'),
currentEntry = $(this).parents('.entry:first'),
newEntry = $(currentEntry.clone()).appendTo(controlForm);
newEntry.find('input').val('');
controlForm.find('.entry:not(:last) .btn-add')
.removeClass('btn-add').addClass('btn-remove')
.removeClass('btn-success').addClass('btn-danger')
.html('<span class="glyphicon glyphicon-minus"></span>');
}).on('click', '.btn-remove', function (e) {
$(this).parents('.entry:first').remove();
e.preventDefault();
return false;
});
});
</script>
Я пытаюсь воспроизвести этот тип сборки для страницы РЕДАКТИРОВАНИЯ, используя приведенный ниже код, однако нажатие на плюс (добавить) добавляет запись в середину списка, пожалуйста, смотрите Изображение ниже и скрипку здесь
<div class="form-group">
<label asp-for="Docs" class="required"><span class="field-name">Documents</span> <strong class="required">(required)</strong></label>
<div class="controls">
@foreach (var item in Model.Docs)
{
<div>
<div class="entry input-group col-xs-3">
<input class="form-control" name="SelectedDocs" type="text" placeholder="#999999" value="@item.Number" />
<span class="input-group-btn">
<button class="btn btn-danger btn-remove" type="button">
<span class="glyphicon glyphicon-minus"></span>
</button>
</span>
</div>
</div>
}
<div>
<div class="entry input-group col-xs-3">
<input class="form-control" name="SelectedDocs" type="text" placeholder="#999999" />
<span class="input-group-btn">
<button class="btn btn-default btn-add" type="button">
<span class="glyphicon glyphicon-plus"></span>
</button>
</span>
</div>
</div>
</div>
</div>
<script>
$(function () {
$(document).on('click', '.btn-add', function (e) {
e.preventDefault();
var controlForm = $('.controls div:first'),
currentEntry = $(this).parents('.entry:first'),
newEntry = $(currentEntry.clone()).appendTo(controlForm);
newEntry.find('input').val('');
controlForm.find('.entry:not(:last) .btn-add')
.removeClass('btn-add').addClass('btn-remove')
.removeClass('btn-success').addClass('btn-danger')
.html('<span class="glyphicon glyphicon-minus"></span>');
}).on('click', '.btn-remove', function (e) {
$(this).parents('.entry:first').remove();
e.preventDefault();
return false;
});
});
</script>
Комментарии:
1. Пожалуйста, не могли бы вы рассказать подробнее?
2. Я добавил ссылку BootSnipp для работы, а jsFiddle не работает.
Ответ №1:
В вашем текущем коде jquery новая строка добавлялась внутри controls
первого div, то есть: div:first
потому что, когда вы смотрите на свою структуру html, то есть :
<div class="controls"><!-- controls-->
<div><!--first div-->
<div class="entry input-group col-xs-3">
<input class="form-control" name="SelectedDocs" type="text" placeholder="#999999" value="@item.Number" />
---
</div>
<!--new row was appending here-->
</div>
<!--other rows-->
</div>
Вместо этого вам нужно использовать here .controls:last-child
, чтобы получить последний разделитель и добавить новую строку после этого.Кроме того, здесь я добавил дополнительный класс, т. е. somehting
чтобы легко клонировать требуемый div, а затем при удалении я использую closest('.somehting')
, чтобы получить ближайший div с этим именем класса и удалить его.
Демонстрационный код :
$(function() {
$(document).on('click', '.btn-add', function(e) {
e.preventDefault();
//get last child of div.controls
var controlForm = $('.controls:last-child'),
//get closest div with class name somehting
currentEntry = $(this).closest('div.somehting'),
newEntry = $(currentEntry.clone()).appendTo(controlForm);
newEntry.find('input').val('');
controlForm.find('.entry:not(:last) .btn-add')
.removeClass('btn-add').addClass('btn-remove')
.removeClass('btn-success').addClass('btn-danger')
.html('<span class="glyphicon glyphicon-minus"></span>');
}).on('click', '.btn-remove', function(e) {
//get closest div with class somehting and remove same
$(this).closest('.somehting').remove();
e.preventDefault();
return false;
});
});
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<div class="form-group">
<label for="RDIMSdocs"><span class="field-name">RDIMS Documents</span> </label>
<div class="controls">
<!--added this class-->
<div class="somehting">
<div class="entry input-group col-xs-3">
<input class="form-control" name="SelectedRDIMSdocs" type="text" placeholder="#999999" value="2222222">
<span class="input-group-btn">
<button class="btn btn-danger btn-remove" type="button">
<span class="glyphicon glyphicon-minus"></span>
</button>
</span>
</div>
</div>
<div class="somehting">
<div class="entry input-group col-xs-3">
<input class="form-control" name="SelectedRDIMSdocs" type="text" placeholder="#999999" value="11111">
<span class="input-group-btn">
<button class="btn btn-danger btn-remove" type="button">
<span class="glyphicon glyphicon-minus"></span>
</button>
</span>
</div>
</div>
<div class="somehting">
<div class="entry input-group col-xs-3">
<input class="form-control" name="SelectedRDIMSdocs" type="text" placeholder="#999999">
<span class="input-group-btn">
<button class="btn btn-default btn-add" type="button">
<span class="glyphicon glyphicon-plus"></span>
</button>
</span>
</div>
</div>
</div>
</div>