5 votes

Pendant le traitement du modèle api/[TodoController], une valeur de remplacement pour le jeton TodoController n'a pas pu être trouvée.

Je débute dans ce domaine et je suis ce tutoriel sur les API web .Net ASP.NET mais je n'arrive pas à résoudre cette erreur. Lorsque je fais "Tester la méthode GetTodoItems" et que j'utilise Postman pour communiquer avec la base de données.

Lorsque je lance le débogage, Chrome s'ouvre et l'erreur suivante est affichée:

System.InvalidOperationException: 'Les erreurs suivantes se sont produites avec ces informations de routage par attribut:

Erreur 1: Pour l'action: 'TodoApi.Controllers.TodoController.GetTodoItems (TodoApi)' Erreur: Lors du traitement du modèle 'api/[TodoController]', une valeur de remplacement pour le jeton 'TodoController' n'a pas pu être trouvée. Jetons disponibles: 'action, controller'. Pour utiliser '[' ou ']' comme chaîne littérale dans une route ou dans une contrainte, utilisez '[[' ou ']]' à la place.

Erreur 2: Pour l'action: 'TodoApi.Controllers.TodoController.GetTodoItem (TodoApi)' Erreur: Lors du traitement du modèle 'api/[TodoController]/{id}', une valeur de remplacement pour le jeton 'TodoController' n'a pas pu être trouvée. Jetons disponibles: 'action, controller'. Pour utiliser '[' ou ']' comme chaîne littérale dans une route ou dans une contrainte, utilisez '[[' ou ']]' à la place.

Voici mon code de contrôleur tel quel du tutoriel:

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)
            {
                // Crée un nouveau TodoItem si la collection est vide,
                // ce qui signifie que vous ne pouvez pas supprimer tous les TodoItems.
                _context.TodoItems.Add(new TodoItem { Name = "Item1" });
                _context.SaveChanges();
            }
        }

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

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

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

            return todoItem;
        }
    }

}

Voici le fichier 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; }

        // Cette méthode est appelée par l'exécution. Utilisez cette méthode pour ajouter des services au conteneur.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext(opt =>
                opt.UseInMemoryDatabase("TodoList"));
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        }

        // Cette méthode est appelée par l'exécution. Utilisez cette méthode pour configurer le pipeline de requête HTTP.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                // La valeur HSTS par défaut est de 30 jours. Vous voudrez peut-être la modifier pour des cas
                // de production, voir https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

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

18voto

John Points 13259

Comme le suggère le message d'erreur, le problème concerne la construction des routes pour votre TodoController. La partie clé du message est la suivante :

une valeur de remplacement pour le token 'TodoController' n'a pas pu être trouvée

[controller] dans le modèle de route est un jeton que ASP.NET Core remplacera automatiquement lors de l'ajout de la route dans la table de routage.

Par exemple, si votre contrôleur s'appelle TodoController, votre route devrait être api/[controller],

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

alors la route finale sera api/Todo.

Comme le signale l'exception, l'utilisation du littéral [TodoController] n'est pas un jeton de routage connu par ASP.NET Core. Ce qui provoquera l'erreur lorsque le framework tentera de générer les routes d'attributs.

Voir Remplacement de jetons dans les modèles de route pour plus d'informations.

0voto

Evgeny Points 11

J'ai obtenu une erreur similaire jusqu'à ce que j'ai changé

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

Sur

[Route("api/message")]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X