私は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" });
});
文字列であるキーでアイテムを取得できない理由を理解できないようです。これは可能ですか?もしそうなら、私は何が間違っていますか?
:string
を削除するだけです。とにかくid
の値を実際に制約しているわけではありません。これは、URL内の文字列です。
このかなり古いブログ投稿 は利用可能な制約をリストしています-必要がないため、:string
制約がないことがわかります。
制約は、「より具体的な」制約に優先順位を付けるために使用されます。 「URLのその部分がDateTime
の文字列表現である場合、このルートを使用します」-ただし、すべてが(URL内の)文字列であるため、:string
の制約によって生じるものはありません。あなたが私が何を意味するかを見るならば、それはより具体的です。