#javascript #c# #ajax #visual-studio #asp.net-core-3.1
#javascript #c# #ajax #visual-studio #asp.net-core-3.1
Вопрос:
Это сводит меня с ума уже пару недель, поэтому, если кто-нибудь может указать мне правильное направление, я был бы очень благодарен.
Я разрабатываю относительно простое CRUD-приложение с использованием .net core и Razor Pages.
Я использовал сообщество Visual Studio 2019 для запуска нового приложения и попросил стандартный вариант CRUD. После небольшой настройки и создания базы данных приложение работает нормально. Вот стандартное отображение таблицы .net core для таблицы с именем «категории»
Однако мне нужна была более красивая таблица, поэтому я пытаюсь использовать вызов ajax из некоторого JavaScript.
На странице у меня есть
<div class="col-12 border p-3">
<table id="DT_load" class="table table-striped table-bordered" style="width:100%">
<thead>
<tr>
<th>Id</th>
<th>Name</th>
<th>In Use?</th>
</tr>
</thead>
</table>
</div>
</div>
@section Scripts
{
<script src="~/js/categoryList.js"></script>
}
Это указывает на этот Javascript
var dataTable;
$(document).ready(function () {
loadDataTable();
alert($('#DT_load').html())
});
function loadDataTable() {
dataTable = $('#DT_load').dataTable
({
"ajax":
{
"url": "/controllers/categories",
"type": "GET",
"datatype": "json"
},
"columns":
[
{ "data": "id", "width": "50%" },
{ "data": "category", "width": "50%" },
{ "data": "inUse", "width": "50%" },
],
"language":
{
"emptyTable": "no data found"
},
"width": "100%"
});
}
Что должно………. Затем получите доступ к этому контроллеру
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Investments10.Models;
namespace Investments10
{
[Route("api/Category")]
//[Route("api/CategoryController")]
[ApiController]
public class CategoriesController : ControllerBase
{
private readonly aspnetInvestments1053bc9b9d9d6a45d484292a2761773502Context _context;
public CategoriesController(aspnetInvestments1053bc9b9d9d6a45d484292a2761773502Context context)
{
_context = context;
}
// GET: api/Categories
[HttpGet]
public async Task<ActionResult> GetAllCategory()
{
return new JsonResult (new { data = await _context.Category.ToListAsync() });
}
// GET: api/Categories/5
[HttpGet("{id}")]
public async Task<ActionResult<Category>> GetCategory(int id)
{
var category = await _context.Category.FindAsync(id);
if (category == null)
{
return NotFound();
}
return category;
}
Однако он никогда не попадает на контроллер. Я вставил несколько точек останова в контроллер, и он туда не попадает. Я подозреваю, что проблема в URL-адресе, который я указал для вызова Ajax, но я перепробовал целую кучу вариантов, и ни один из них, похоже, не получает вызов, обращающийся к контроллеру.
Структура файла приведена ниже.
Что особенно раздражает, так это то, что я знаю, что этот метод работает, потому что у меня есть почти идентичный пример из чужого проекта, который работает нормально.
Любая помощь будет принята с благодарностью. Спасибо!
Ответ №1:
Добавьте свои атрибуты маршрута действия, подобные этим:
.........
[Route("~/api/Category/GetAllCategory")]
public async Task<ActionResult> GetAllCategory()
............
[Route("~/api/Category/GetCategory/{id}")]
public async Task<ActionResult<Category>> GetCategory(int id)
.......
И на будущее лучше не использовать GET , POST и т. Д. В действиях. Компьютер лучше знает, что использовать для запроса.
Комментарии:
1. Спасибо, Сергей. Очень признателен. Я попробую это сделать.
Ответ №2:
Ах, ха! Я нашел проблему. Чтобы использовать маршрутизацию в контроллерах, мне нужно было добавить строку
endpoints.MapControllers();
в мой файл startup.cs