2016-07-29 7 views
0

のは、私がASP.NET MVCルーティングにはintと文字列を区別する方法がありますか?

[Route("foo/bar/{id}")] 
IHttpActionResult SomeController (string id) 
{ 
    // ... 
} 

[Route("foo/bar/{id}")] 
IHttpActionResult SameRouteAsAbove (int id) 
{ 
    // ... 
} 

のような2つのコントローラのアクションを持っていると私はURL "foo/bar/123"にリクエストを作るとしましょう。 IISやそれ以外のものは数値の文字列表現を意図していても数字のようなものなので、SameRouteAsAboveとヒットしますか?

+0

は、おそらく設計上の問題ですが、多分あなたは使用して試みることができるあなたのルート属性に:{文字列のid} {ID} int型とを。 –

+0

@DanHogan [this](https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/)には文字列がありません – Tarek

答えて

0

いいえ、あなたは要求が"foo/bar/123"を言っ作るとき、それは実際にリクエストクエリ文字列の一部ですので、stringが、それはあなたのアクションメソッドのパラメータ型に適切にid値をマッピングするために責任を取るので、それなるあなたのMVC Model Binderますです定義したタイプごとにマッピングされます。

投稿コードごとに、ルートを個別に指定しない限り、これはあいまいになります。あなたにもさらに一歩進み、

[Route("foo/bar/{id:int}")] 
IHttpActionResult SameRouteAsAbove (int id) 
{ 
    // ... 
} 
2

のようなあなたのRoute値を定義はい、あなたは正規表現を使用することができますし、あなたがそれを望むように変更することができます。

FYI:可能性のあるシナリオをすべてテストする必要があります。それ以外の場合は、両方のルートが指定されたIDと一致すると実行時エラーが発生します。私はこのように感じる

public class ValuesController : ApiController 
{ 
    // GET api/values/1 
    [Route("api/values/{id:int}")] 
    public IHttpActionResult GetInteger(int id) 
    { 
     return Ok(id); 
    } 

    // GET api/values/abc 
    [Route("api/values/{id:regex([a-zA-Z])}")] 
    public IHttpActionResult GetString(string id) 
    { 
     return Ok(id); 
    } 
} 
+0

なぜRegx [a-zA-Z]を使用して、同じ効果に{id:alpha}を使用できますか?属性の制約を確認する[ここ](https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/) – Tarek

+0

@Tarek良いキャッチ。あなたは間違いなく、この彩度で***アルファ***を使用することができます。私は一般的なケースを示したいと思う。 – Win

+0

最初に登録されたルートを選択するmvcルーティングではなく、実行時の例外が発生しますか? –

関連する問題