C# 基于字符串获取元素

C# 基于字符串获取元素,c#,asp.net-core,asp.net-core-routing,C#,Asp.net Core,Asp.net Core Routing,我正在使用MVC6创建一个web api。现在我正试图从我的数据库中获取一个元素。此表中的键是字符串(电子邮件地址)。我没有访问此数据库的权限,因此无法更改此表的键 现在,在创建演示webapi时,我能够创建一个控制器,根据一个int键提取项目。但是当试图通过字符串获取元素时,程序崩溃 [Route("api/[controller]")] public class TodoController : Controller { [HttpGet("

我正在使用MVC6创建一个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异常 类型为“DefaultInlineConstraintResolver”的约束解析程序无法解析路由“api/Todo/{id:string}”上的约束项“id”-“string”

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

            });
我似乎不明白为什么我不能用一个字符串键来获取物品。
这可能吗?如果可能,我做错了什么?

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

列出可用的约束-您可以看到没有
:string
约束,因为您不需要约束


这些约束用于为“更具体”的约束赋予优先级-例如,“如果URL的该部分是
日期时间的字符串表示,请使用此路由”-但由于所有内容都是字符串(在URL中),因此
:string
的约束不会使其比,如果你明白我的意思。

你真的需要
:string
部分吗?你可以删除
:string
它默认使用。thx它完成了任务(;这也适用于.NET Core 2.0中的Razor页面,我想这与将所有部分放在一起的过程相当相同。