Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

While processing template api/[TodoController], a replacement value for the token TodoController could not be found

I'm new to this and following this .Net ASP.NET wep api tutorial but cant get past this error. When doing the "Test the GetTodoItems method" and running the Postman to get/set against the DB.

When I start debugging, Chrome launches and the following error is thrown:

System.InvalidOperationException: 'The following errors occurred with attribute routing information:

Error 1: For action: 'TodoApi.Controllers.TodoController.GetTodoItems (TodoApi)' Error: While processing template 'api/[TodoController]', a replacement value for the token 'TodoController' could not be found. Available tokens: 'action, controller'. To use a '[' or ']' as a literal string in a route or within a constraint, use '[[' or ']]' instead.

Error 2: For action: 'TodoApi.Controllers.TodoController.GetTodoItem (TodoApi)' Error: While processing template 'api/[TodoController]/{id}', a replacement value for the token 'TodoController' could not be found. Available tokens: 'action, controller'. To use a '[' or ']' as a literal string in a route or within a constraint, use '[[' or ']]' instead.'

This is my controller code straight from the tutorial:

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;
        }
    }

}

Here is the startup.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();
        }
    }
}
like image 689
Tord Larsen Avatar asked Jun 08 '19 14:06

Tord Larsen


3 Answers

As the error message suggests, the problem relates to building the routes for your TodoController. The key part of the message is this:

a replacement value for the token 'TodoController' could not be found

[controller] in the route template is a token which ASP.NET Core will automatically replace when adding the route to the route table.

For example, given your controller is called TodoController, the your route should be api/[controller],

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

then the final route will be api/Todo.

As noted by the exception, using the literal [TodoController] isn't a known ASP.NET Core routing token. Which will cause the error when the framework tries to generate the attribute routes.

See Token replacement in route templates for more information.

like image 177
DiplomacyNotWar Avatar answered Nov 17 '22 09:11

DiplomacyNotWar


I got a similar error until changed

[Route("api/[message]")]

On

[Route("api/message")]
like image 33
Evgeny Avatar answered Nov 17 '22 09:11

Evgeny


I have changed from [Route("api/[TodoItemsController]")] to [Route("api/TodoItemsController")]. It worked. Yay

like image 1
ehs2020 Avatar answered Nov 17 '22 10:11

ehs2020