2016-07-29 15 views
0

Lassen Sie uns sagen, ich habe zwei Controller-Aktionen wieKann ASP.NET MVC-Routing zwischen Ints und Strings unterscheiden?

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

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

und ich mache eine Anfrage an die URL "foo/bar/123". Zählt IIS oder was auch immer das als Hit SameRouteAsAbove da der Parameter nummerisch ist, obwohl es als String-Repräsentation der Zahl gedacht sein könnte?

+0

ich so das Gefühl ist wahrscheinlich ein Design-Problem, aber vielleicht könnten Sie versuchen, mit {id: int} und {id: string} in der Route-Attribute. –

+0

@DanHogan nach [dies] (https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/) gibt es keine Zeichenfolge – Tarek

Antwort

0

Nein, wenn Sie den Antrag stellen "foo/bar/123" sagen, es ist in der Tat Teil der Anforderungsabfragezeichenfolge und damit eine string aber es ist Ihre MVC Model Binder die Verantwortung übernehmen, die id Wert richtig mit dem Aktionsmethode Parametertyp abzubilden und somit wird es werden nach dem von Ihnen definierten Typ gemappt.

Nach Ihrem geposteten Code wäre das mehrdeutig, wenn Sie die Route nicht separat angeben. Sie können auch einen Schritt weiter gehen und Ihre Route Wert wie

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

definieren Ja, Sie regulären Ausdruck verwenden können, und ändern, wie Sie es möchten.

FYI: Sie müssen alle möglichen Szenarien testen. Andernfalls erhalten Sie einen Laufzeitfehler, wenn beide Routen mit der angegebenen ID übereinstimmen.

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

Warum würden Sie ein Regx [a-zA-Z] verwenden, wo Sie {id: alpha} mit dem gleichen Effekt verwenden könnten? Überprüfen Sie Attributbeschränkungen [hier] (https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/). – Tarek

+0

@Tarek Guter Fang. Sie können definitiv *** Alpha *** in dieser Sättigung verwenden; Ich möchte nur den allgemeinen Fall zeigen. – Win

+0

Sind Sie sicher, dass Sie eine Laufzeitausnahme erhalten und nicht das mvc-Routing, das die zuerst registrierte Route auswählt? –

Verwandte Themen