При обработке шаблона api / [TodoController] не удалось найти заменяющее значение для токена TodoController. - PullRequest
0 голосов
/ 08 июня 2019

Я новичок в этом и следую этому .Net ASP.NET учебному пособию по wep , но не могу обойти эту ошибку.При выполнении «Тестирования метода GetTodoItems» и запуске Почтальона для получения / установки на БД.

Когда я запускаю отладку, запускается Chrome и выдается следующая ошибка:

System.InvalidOperationException: 'Следующие ошибки произошли с информацией о маршрутизации атрибута:

Ошибка 1: Для действия:' TodoApi.Controllers.TodoController.GetTodoItems (TodoApi) 'Ошибка: При обработке шаблона' api / [TodoController] 'значение замены для токена TodoController не найдено.Доступные токены: «действие, контроллер».Чтобы использовать '[' или ']' в качестве литеральной строки в маршруте или в пределах ограничения, используйте вместо него '[[' или ']]'.

Ошибка 2: Для действия: 'TodoApi.Controllers.TodoController.GetTodoItem (TodoApi) 'Ошибка: при обработке шаблона' api / [TodoController] / {id} 'не найдено значение замены для токена' TodoController '.Доступные токены: «действие, контроллер».Чтобы использовать '[' или ']' в качестве литеральной строки в маршруте или в пределах ограничения, используйте вместо него '[[' или ']]'. '

Это мой код контроллера прямоиз учебника:

using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using TodoApi.Models;

namespace TodoApi.Controllers
{
    [Route("api/[TodoController]")]
    [ApiController]
    public class TodoController : ControllerBase
    {
        private readonly TodoContext _context;

        public TodoController(TodoContext context)
        {
            _context = context;

            if (_context.TodoItems.Count() == 0)
            {
                // Create a new TodoItem if collection is empty,
                // which means you can't delete all TodoItems.
                _context.TodoItems.Add(new TodoItem { Name = "Item1" });
                _context.SaveChanges();
            }
        }

        // GET: api/Todo
        [HttpGet]
        public async Task<ActionResult<IEnumerable<TodoItem>>> GetTodoItems()
        {
            return await _context.TodoItems.ToListAsync();
        }

        // GET: api/Todo/5
        [HttpGet("{id}")]
        public async Task<ActionResult<TodoItem>> GetTodoItem(long id)
        {
            var todoItem = await _context.TodoItems.FindAsync(id);

            if (todoItem == null)
            {
                return NotFound();
            }

            return todoItem;
        }
    }

}

Вот это запуск.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using TodoApi.Models;

namespace TodoApi
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the 
        //container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<TodoContext>(opt =>
                opt.UseInMemoryDatabase("TodoList"));
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP 
        //request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                // The default HSTS value is 30 days. You may want to change this for 
                // production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseMvc();
        }
    }
}

1 Ответ

2 голосов
/ 08 июня 2019

Как следует из сообщения об ошибке, проблема связана с построением маршрутов для вашего TodoController. Ключевая часть сообщения такова:

значение замены для токена 'TodoController' не найдено

[controller] в шаблоне маршрута - это токен, который ASP.NET Core будет автоматически заменять при добавлении маршрута в таблицу маршрутов.

Например, если ваш контроллер называется TodoController, ваш маршрут должен быть api/[controller],

[Route("api/[controller]")]
public class TodoController : ControllerBase {
    //...
}

тогда окончательный маршрут будет api/Todo.

Как отмечено в исключении, использование литерала [TodoController] не является известным токеном маршрутизации ASP.NET Core. Что приведет к ошибке, когда платформа попытается сгенерировать атрибуты маршрутов.

См. Замена токенов в шаблонах маршрутов для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...