【问题标题】:While processing template api/[TodoController], a replacement value for the token TodoController could not be found处理模板 api/[TodoController] 时,找不到令牌 TodoController 的替换值
【发布时间】:2019-06-08 14:03:29
【问题描述】:

我是新手,关注这个.Net ASP.NET wep api tutorial,但无法克服这个错误。在执行“测试 GetTodoItems 方法”并运行 Postman 以获取/设置数据库时。

当我开始调试时,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;
        }
    }

}

这里是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();
        }
    }
}

【问题讨论】:

  • 遇到什么问题喜欢分享一下。
  • 顺便说一下,那个教程没有有那个代码。当您所遵循的教程/书籍似乎不起作用时,您应该仔细检查您的代码是否真正匹配。
  • 现在图片(完美显示发生在哪里、发生了什么)已经消失,所以错误出现在 startup.cs 的第 46 行,如app.UseMvc();
  • @ExocetKid 不,该行仅确保您配置的内容是正确的,并且,正如异常告诉您的那样,有些地方不正确。那条线本身没有任何问题
  • @ExocetKid 错误发生在那里,因为那是它生成所有路由并将它们添加到路由表的时候..

标签: c# asp.net-core


【解决方案1】:

正如错误消息所暗示的,问题与为 TodoController 构建路由有关。消息的关键部分是这样的:

找不到token“TodoController”的替换值

路由模板中的[controller]是一个令牌,ASP.NET Core在将路由添加到路由表时会自动替换。

例如,假设你的控制器名为TodoController,你的路由应该是api/[controller],

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

那么最后的路由是api/Todo。

正如异常所指出的,使用文字 [TodoController] 不是已知的 ASP.NET Core 路由令牌。当框架尝试生成属性路由时会导致错误。

更多信息请参见Token replacement in route templates。

【讨论】:

    【解决方案2】:

    在更改之前我遇到了类似的错误

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

    开启

    [Route("api/message")]
    

    【讨论】:

    • 你把它从前者改为后者吗?或相反亦然?我不清楚你在这里所说的“开”是什么意思。在上下文中,我假设格式,但不想在没有事先确认的情况下将其更改为“to”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2017-06-10
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多