#javascript #jquery #ajax #asp.net-mvc
#javascript #jquery #ajax #asp.net-mvc
Вопрос:
У меня есть ViewModel со списком параметров. В представлении пользователь должен иметь возможность добавлять или удалять из этого списка таким образом, чтобы добавленные или удаленные пользователи отражались в POST для этого параметра. В jQuery после нажатия кнопки «Добавить» вызов ajax возвращает переменную UserModel, но simple .append не добавляет в список.
Другие вопросы, которые я видел по этой проблеме, касаются частичных представлений, но в этой ситуации таблица UserModel обновляется без необходимости частичного представления. Кажется, что должен быть простой способ сделать это. Кто-нибудь знает, как добавить возвращенную UserModel в список в jQuery, чтобы список был возвращен в Post с добавленными моделями?
<script>
$("#bUser").on('click', function () {
var $addedRecipient = $("#AddedRecipient");
if ($addedRecipient.val() != null amp;amp; $addedRecipient.val() != "") {
$.ajax({
type: "GET",
url: '@Url.Action("GetFullRecipient", "Message")',
data: { CompanyID: $("#CompanyID").val(), Employee: $addedRecipient.val() },
success: function (data) {
$("#Recipients").append(data);//Not adding to Recipients (Model.List<UserModel>) - is there a simple solution like this?
var bRow = $('<tr></tr>'),
bCell = $('<td style="display:none"></td>').append(data.UserID);
bRow.append(bCell);
bCell = $('<td align="center"></td>').append(data.UserFirstName);
bRow.append(bCell);
bCell = $('<td align="center"></td>').append(data.UserEmail);
bRow.append(bCell);
bCell = $('<td align="center"><input type="button" class="btn btn-info removeRecipient" value="Remove"></td>');
bRow.append(bCell);
$("#bTable tbody").append(bRow);//Works with returned data
$addedRecipient.val("");
},
error: function () {
alert("Recipient could not be added.");
}
});
}
});
</script>
Комментарии:
1.
returns a UserModel variable
можете ли вы подробнее рассказать о том, как вы возвращаете это? Вы возвращаете это как JSON? Что вы получаете приsuccess:
обратном вызове?success: function (data) { console.log(data); }
2.
$("#Recipients").append(data);
— еслиdata
это HTML, то это будет работать — если это JSON, то нет, это не имеет смысла, так как.append
нужен HTML. Вот почему другие предложения для asp.net-mvc возвращают частичное представление, то есть строку HTML. Если вы просто возвращаете «объект», как вы ожидаете, что он будет преобразован в HTML? Особенно, поскольку ваш HTML выглядит как таблица, что, если вы измените его на div-layout? Откуда ему знать? Если вы хотите вернуть объект, вам придется создать HTML-код самостоятельно.3. Если проблема в том, что при публикации вы не добавляете ее в модель вашего действия (как подразумевается «не добавлять в
Model.List<>
«, что не имеет смысла для javascript / jquery), то это совершенно другая проблема.4. @freedomn-m Я добавил правку, отражающую ваш третий комментарий. Проблема не отображается, так как в таблице пользователей отображаются новые добавленные записи, но POST не содержит этих добавленных пользовательских записей в параметре List.
5. Хорошо, зависит от того, как определено ваше действие и как вы визуализируете исходную таблицу. Скорее всего, это создает входные данные с именами типа
<input type="hidden" name="userid[0]"/><input type="hidden" name="userid[1]"/>
— они должны быть последовательными. Когда вы добавляете свою новую строку, добавьте следующий доступный номерname="userid[2]"
, тогда она будет правильно привязана (при условии, что сигнал действия правильный). Прочитал haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
Ответ №1:
для меня этот код сработал идеально, вам просто нужно просмотреть этот список, очевидно, вам нужно ввести директиву @model и тип получателя списка.
@model List<...Models.Recipient>
<input type="button" id="btnAdd" class="btn btn-primary" value="Add"
onclick="myfunction()"/>
<script>
function myfunction() {
$.ajax({
type: 'GET',
contentType:"application/json; charset=utf-8",
url: '@Url.Action("GetFullRecipient","Message")',
data: { CompanyID: $("#CompanyID").val(), Employee:
$addedRecipient.val()},
success: function (response) {
$("#containerData").html(response);
},
error: function (result) {
alert(result);
}
});
}
</script>
<div id="containerData">
<table class="table table-striped table-hover table-bordered">
<thead>
<tr>
<th>Id</th>
<th>Desc_Prod</th>
<th>Cantidad</th>
</tr>
</thead>
<tbody>
@if (Model != null)
{
foreach (var item in Model)
{
<tr>
<td>@item.UserID</td>
<td>@item.UserFirstName</td>
<td>@item.UserEmail</td>
<td><a class="btn btn-danger" href="@Url.Action("DeleteRow","Message", new {item.UserID})">Delete</a></td>
</tr>
}
}
</tbody>
</table>
</div>
Комментарии:
1. Спасибо за ответ! Я добавил правку, чтобы прояснить вопрос. Отображение обновляет таблицу любыми новыми добавленными пользователями, но сообщение обратно контроллеру не содержит никаких добавленных пользователей в параметре списка. Будет ли этот ответ выполнять это?
Ответ №2:
Ответ здесь следовал по ссылке в комментарии freedomn-m. Выполните итерацию по таблице Razor с помощью цикла for, затем используйте HiddenFor с идентификатором параметра модели и CheckBoxFor в качестве поля выбора параметра модели, и у вас будет кнопка отправки с уникальным именем и значением. Когда нажата кнопка ввода и значение соответствует заданной строке, выполните цикл по модели и добавьте пользователя, которого там нет, или вычтите пользователя, который там есть, и вернитесь к представлению.
<div class="row">
<div class="col-lg-12">
<table class="table table-bordered" id="bTable">
<thead>
<tr>
<th style="display:none"></th>
<th style="display:none"></th>
<th class="text-center">Recipient</th>
<th class="text-center">E-mail</th>
<th class="text-center">Select</th>
</tr>
</thead>
<tbody>
@if (Model.Recipients.Any())
{
for (var i = 0; i < Model.Recipients.Count; i )
{
<tr>
<td style="display:none">@Html.HiddenFor(m => m.Recipients[i].RecipientUserID)</td>
<td style="display:none">@Html.HiddenFor(m => m.Recipients[i].RecipientCorporateID)</td>
<td align="center">@Model.Recipients[i].RecipientName</td>
<td align="center">@Model.Recipients[i].RecipientEmail</td>
<td align="center">@Html.CheckBoxFor(m => m.Recipients[i].RemoveRecipient)</td>
</tr>
}
}
</tbody>
</table>
</div>
</div>