Добавление в список с помощью jQuery

#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>