27

我正在使用 mvc 6 创建一个 web api。现在我正在尝试从我的数据库中获取一个元素。此表中的键是一个字符串(电子邮件地址)。我无权访问此数据库,因此无法更改此表的键。

现在,当创建一个演示 webapi 时,我能够创建一个控制器来基于一个 int 键来提取项目。但是当试图通过字符串获取元素时,程序崩溃了。

    [Route("api/[controller]")]
    public class TodoController : Controller
    {    

        [HttpGet("{id:string}", Name = "GetByIdRoute")]
        public IActionResult GetById (string id)
        {
            var item = _items.FirstOrDefault(x => x.Id == id);
            if (item == null)
            {
                return HttpNotFound();
            }

            return new ObjectResult(item);
        }
   }

当尝试访问此路径(example.com/api/Todo/key)作为字符串的键时,我在 startup.cs 中出现异常

浏览器中的异常显示:

System.InvalidOperationException 路由“api/Todo/{id:string}”上的约束条目“id”-“string”无法由“DefaultInlineConstraintResolver”类型的约束解析器解析。

代码中断的startup.cs部分是:

// Add MVC to the request pipeline.
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller}/{action}/{id?}",
                    defaults: new { controller = "Home", action = "Index" });   

            });

我似乎无法弄清楚为什么我不允许通过作为字符串的键获取项目。这甚至可能吗?如果是这样,我做错了什么?

4

1 回答 1

69

只需删除:string. 无论如何,您并没有真正限制它的值id- 它已经是 URL 中的一个字符串。

这篇相当老的博客文章列出了可用的约束——您可以看到没有:string约束,因为您不需要有约束。

约束用于为“更具体”的约束赋予优先级 - 例如,“如果 URL 的那部分是 a 的字符串表示DateTime,则使用此路由” - 但由于一切都是字符串(在 URL 中),没有什么比如果你明白我的意思的话,它的约束:string会使它更具体。

于 2015-06-20T07:55:23.907 回答