web-dev-qa-db-ja.com

文字列に基づいて要素を取得する

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

            });

文字列であるキーでアイテムを取得できない理由を理解できないようです。これは可能ですか?もしそうなら、私は何が間違っていますか?

26

:stringを削除するだけです。とにかくidの値を実際に制約しているわけではありません。これは、URL内の文字列です。

このかなり古いブログ投稿 は利用可能な制約をリストしています-必要がないため、:string制約がないことがわかります。

制約は、「より具体的な」制約に優先順位を付けるために使用されます。 「URLのその部分がDateTimeの文字列表現である場合、このルートを使用します」-ただし、すべてが(URL内の)文字列であるため、:stringの制約によって生じるものはありません。あなたが私が何を意味するかを見るならば、それはより具体的です。

60
Jon Skeet