【问题标题】:How to send a list of data from controller to a modal popup in razor如何将数据列表从控制器发送到剃须刀中的模式弹出窗口
【发布时间】:2020-08-16 12:28:03
【问题描述】:

我正在实施 asp.net core 3.1 项目。我有一个 razor 视图,在 razor 中,我显示了一些从控制器中的 Index 方法获取的数据,它的名称是 RequestorsController。在剃须刀中,对于每一行都有一个名为“详细信息”的链接,我希望当用户单击每一行的详细信息按钮时,该行的相关 ID 传递给 RequestorsController 中名为“详细信息”的方法和一个列表相关数据返回剃刀视图并显示在模态弹出窗口中。现在我可以实现模态弹出窗口,但我的问题是我无法从控制器中获取数据以显示在模态上。如果有人能解决我的问题,我将不胜感激。

<div id="tablecontainer" class="my-5 col-sm-12  d-flex justify-content-center">
        <table id="myDummyTable" class="table m-table mytable table-striped mb-4 col-12 dataTable table-bordered px-0 mx-0" style="box-sizing:content-box;">
            <thead>
                <tr id="headerrow">
      
                    <th>
                        requestor name
                    </th>

                    <th>
                        items requested
                    </th>
                  
                    <th>
                        operations
                    </th>
                </tr>
            </thead>
            <tbody>
                @foreach (var item in Model)
                {
                    <tr>
                      
                        <td>
                            @Html.HiddenFor(modelItem => item.applicantID)
                            @Html.DisplayFor(modelItem => item.requestorName)
                        </td>


                        <td>
                            @Html.DisplayFor(modelItem => item.requesteditemCount)
                        </td>
                        
                        <td>

                            <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal" data-id="@item.applicantID">Details</button>
                        </td>
                    </tr>
                }
            </tbody>
        </table>
    </div>

    <div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title" id="exampleModalLabel">New message</h5>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                </div>
                <form method="post">
                    <div class="modal-body">

                        <div class="form-group">
                            <label for="recipient-apiname" class="col-form-label">name:</label>
                            <input type="text" class="form-control" id="recipient-apiname" name="apiname">
                            <input type="hidden" id="recipient-id" name="id" />
                        </div>
                        <div class="form-group">
                            <label for="recipient-status" class="col-form-label">status:</label>
                            <input type="text" class="form-control" id="recipient-status" name="status">
                        </div>

                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                        <input type="submit" class="btn btn-primary" value="Save" />
                    </div>
                </form>
            </div>
        </div>
    </div>

    @section scripts{
        <script>
        @{
            if (ViewBag.ModalState == null)
            {
                ViewBag.ModalState = "hide";
            }
        }
        $('#exampleModal').modal('@ViewBag.ModalState');

        $('#exampleModal').on('show.bs.modal', function (event) {
            var button = $(event.relatedTarget);
            var id = button.data('id');

            var modal = $(this);
            modal.find('.modal-body input[name="id"]').val(id);

            $.get('@Url.Action("Details", "Requestors")/' + id, function (data) {

                modal.find('.modal-body input[name="name"]').val(data.itemName);
                modal.find('.modal-body input[name="status"]').val(data.requestStatus);
            });

        });
        </script>
    }
 


   public async Task<IActionResult> Details(int? id)
        {
            
                List<ItemDTO> al = new List<ItemDTO>();

                ItemDTO apDTO;
                

                var myquery = (from t in _context.Items
                               where t.ApplicantId == id
                               select new { ItemName = t.ItemName, requestStatus = t.LastRequestStatus }).ToList();



                foreach (var index in myquery)
                {
                    apDTO = new ItemDTO();

                    apDTO.itemName = index.itemName;
                    apDTO.requestStatus = index.requestStatus;

                    al.Add(apDTO);
                }
                return View(al);
            }

【问题讨论】:

  • 您需要在单击按钮时编写事件,然后您需要获取该按钮的data-id,然后将其传递给 ajax 并以模态显示。我对 asp.net 了解不多,但是确保您从后端接收到正确的数据。
  • 我想我做了你在我的代码中提到的事情。但是不知道为什么modal不显示数据
  • 这里 input[name="name"] 应该是 input[name="apiname"] 。你也检查过 data 里面有什么吗?
  • 谢谢,调试后我看到错误是“加载资源失败:服务器响应状态为 500 () Requestors/Details”

标签: ajax razor asp.net-core-mvc


【解决方案1】:

现在我可以实现模态弹出窗口,但我的问题是我不能 从控制器中获取数据以显示在模态上。

正如您在评论中提到的,当您单击详细信息按钮时,会出现 500 错误,我确实重现了此错误。

这是因为Details动作返回的是View而不是需要在ajax中返回的json数据,并且因为没有Details视图,所以出现500错误。

要解决,只需要更改返回Json数据的Details动作的内容,如下图:

public async Task<IActionResult> Details(int? id)
        {

            List<ItemDTO> al = new List<ItemDTO>();

                ItemDTO apDTO;
                

                var myquery = (from t in _context.Items
                               where t.ApplicantId == id
                               select new { ItemName = t.ItemName, requestStatus = t.LastRequestStatus }).ToList();



                foreach (var index in myquery)
                {
                    apDTO = new ItemDTO();

                    apDTO.itemName = index.ItemName;// here is ItemName(case sensitive)
                    apDTO.requestStatus = index.requestStatus;

                    al.Add(apDTO);
                }
            return Json(al);
        }

我的疑问是,如果ApplicantIdkey,那么从Items表中获取的数据计数一定是一个,不需要列表集合,但是因为你返回的是一个集合数据,那么在ajax中,需要通过data[0]来绑定对应的输入值/

您需要将input[name="name"] 更改为input[name="apiname"]

这里是ajax代码:

 $.get('@Url.Action("Details", "Requestors")/' + id, function (data) {

                modal.find('.modal-body input[name="apiname"]').val(data[0].itemName);
                modal.find('.modal-body input[name="status"]').val(data[0].requestStatus);
            });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多