#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. Он не попадает в контроллер