проблемы с маршрутизацией на страницах razor

#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