Почему моя кнопка в моей таблице данных передает 0 при каждом нажатии, а не идентификатор, который она должна передавать?

#javascript #jquery #ajax #asp.net-core

#javascript #jquery #ajax #asp.net-core

Вопрос:

Я хочу, чтобы моя кнопка передавала идентификатор элемента в строке. Я вижу, что кнопка содержит идентификатор элемента в строке, используя инструменты разработчика в браузере. Однако, когда я нажимаю кнопку, 0 передается каждый раз. Кнопки находятся в таблице данных jQuery. Ниже приведен код с данными:

 <html>
<head>
    <!--CSS for DataTables-->
    <link href="//cdn.datatables.net/1.10.22/css/jquery.dataTables.min.css" rel="stylesheet" />

</head>

<body>
    <h1>All Accounts</h1>
    <br />
    <br />
    <div>
        <table id="allAccounts" class="table table-striped table-bordered" style="width:100%">
            <thead>
                <tr>
                    <th>First Name</th>
                    <th>Last Name</th>
                    <th>Organization</th>
                    <th>State</th>
                    <th>Actions</th>
                </tr>
            </thead>
            <tbody></tbody>
        </table>
    </div>
    <div>
        <a asp-action="Index">Back to Home</a>
    </div>


</body>
</html>


@section Scripts{
    <script type="text/javascript" src="~/lib/jquery/dist/jquery.js"></script>
    <script type="text/javascript" src="//cdn.datatables.net/1.10.22/js/jquery.dataTables.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $('#allAccounts').DataTable(
                {
                    "responsive": true,
                    "ajax": {
                        "url": "/api/User/GetUsers",
                        "dataSrc": ""

                    },
                    "columns": [
                        { "data": "FirstName" },
                        { "data": "LastName" },
                        { "data": "Organization" },
                        { "data": "State" },
                        {
                            "data": "Id",
                            "render": function (data, type, row, meta) {
                                return "<button class='btn btn-danger' style=margin-right:5px; onclick=DeleteUser("   row.Id   ")>Delete</button>"

                            }
                        }
                    ]
                });
        });
      
        function DeleteUser(data) {
            $.ajax({
                "type": "POST",
                "url": "/api/User/Delete",
                "data": data
            })
        }
    </script>
}
 

Метод удаления, найденный в пользовательском контроллере, приведен ниже:

 [HttpPost]
public IActionResult Delete(int data)
{
    

    return RedirectToAction("DeleteUserConfirm", "Home", data);
}
 

Метод домашнего контроллера приведен ниже:

         [HttpGet]
        public IActionResult DeleteUserConfirm(int id)
        {
         
            return View(_userRepository.GetUser(id));
            
        }
 

getUser() работает, и я вижу, что он получает объект из базы данных. Однако страница DeleteUserConfirm не отображается. Я также пробовал использовать ViewData.Model = _userRepository.getUser(id); return View(); который также не сработал.

Я знаю, что перенаправлять на другой контроллер не рекомендуется. Однако на данный момент я бы просто хотел, чтобы кнопка передавала правильные данные. Ноль передается пользовательскому контроллеру, поэтому я знаю, что URL-адрес Ajax передает данные правильному методу. Однако передаваемые данные неверны. Любые предложения о том, как заставить кнопку передавать идентификатор элемента в строке, будут с благодарностью приняты!

Ответ №1:

В вашем методе контроллера отсутствует [FromBody]

 [HttpPost]
public IActionResult Delete([FromBody]int data)
{    
    return RedirectToAction("DeleteUserConfirm", "Home", data);
}
 

и Ajax-вызов отсутствует

 contentType: 'application/json; charset=utf-8'
 

и вам придется использовать это для данных

 JSON.stringify(data)
 

и ваш редирект должен быть таким

 return RedirectToAction("DeleteUserConfirm", "Home", new { id = data });
 

Комментарии:

1. Когда я добавил [FromBody] в свой метод контроллера, я получил ошибку HTTP 415, которая связана с ошибкой клиента неподдерживаемого типа носителя

2. Привет. Вы также отсутствуете contentType: 'application/json; charset=utf-8' в своем Ajax-вызове. Это исправит ошибку 415.

3. Я также попытался добавить ContentType, и я получаю ошибку HTTP 400.

4. Пожалуйста, установите точку останова внутри вашего метода контроллера и проверьте, попадает ли ваш код в контроллер.

5. Он не попадает в контроллер