根据字符串

时间:2015-06-20 07:47:09

标签: c# asp.net-core asp.net-core-routing

我正在使用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" });   

            });

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

1 个答案:

答案 0 :(得分:54)

只需删除:string即可。你并没有真正限制id的价值 - 它已经是URL中的一个字符串。

This fairly old blog post列出了可用的约束 - 你可以看到没有:string约束,因为你不需要它。

约束用于赋予“更具体”约束优先权 - 例如“如果URL的那一部分是DateTime的字符串表示,请使用此路由” - 但由于所有内容都是字符串(在URL中),因此:string的约束不会产生任何影响如果你明白我的意思,那就更具体了。