2014-01-17 5 views
9

Wie kann ich die URL von Web-API aus meiner Sicht bekommen?Construct url in Sicht für Web Api mit Attribut-Routing

Beispiel (aus der msdn-blog):

[RoutePrefix("reviews")] 
public class ReviewsController : ApiController 
{ 
    // eg.: /reviews 
    [Route] 
    public IHttpActionResult Get() { ... } 
    // eg.: /reviews/5 
    [Route("{reviewId}")] 
    public IHttpActionResult Show(int reviewId) { ... } 
    // eg.: /reviews/5/edit 
    [Route("{reviewId}/edit")] 
    public IHttpActionResult Edit(int reviewId) { ... } 
} 

Jetzt möchte ich "/ reviews/bearbeiten" aus meiner Sicht konstruieren, wie kann ich das tun?

Ich habe versucht, eine kleine Erweiterungsmethode zu erstellen, aber es erfordert, dass ich jeder Route einen tatsächlichen "RouteName" gebe. Gibt es eine Methode, die ich verwenden kann (wie in MVC), wo ich nur den Controller und die Aktion übergeben kann?

@Url.Action("Edit", "Reviews) 

Die Methode ich jetzt benutze (mit Route) auch erlaubt mir nicht, ganze Zahlen als Parameter zu verwenden (es sei denn ich einen Standardwert übergeben). Wenn ich alle meine Routen benennen muss, wie kann ich eine Routen-URL erstellen, aber meine Parameter im "Daten" -Bereich meiner Anfrage übergeben?

Aktuelle Methode:

public static string ResolveWebApiRoute(this UrlHelper urlHelper, string routeName, object routeValues = null) 
{ 
    var newRouteValues = new RouteValueDictionary(routeValues); 
    newRouteValues.Add("httproute", true); 

    return urlHelper.RouteUrl(routeName, newRouteValues); 
} 

EDIT

Als ich Methoden wie Url.RouteUrl(new { controller = ..., action = ...}), Er leitet direkt zu dieser Aktion (zB new { controller = "Reviews", action = "Show"} --> /reviews/show, Whilest ich es /reviews/...

+0

Sieht aus wie es einige Verwirrung ist ... Sie versuchen, einen Link zu erzeugen zu einer MVC-Aktion und NICHT Web-API. 'httproute' wird verwendet, um Links zu einem Web-API-Controller zu generieren und nicht wie in Ihrem Fall MVC. –

+0

Das war eine falsche Kopie/einfügen, es ist definitiv ein Web-API-Controller, kein MVC-Controller, danke für das zeigen –

Antwort

21

Generieren von Links zu Web-API-Routen immer erforderlich ein RouteName, so sollten Sie etwas wie unten haben:

[Route("{reviewId}/edit", Name="EditView")] 
public IHttpActionResult Edit(int reviewId) { ... } 

Sie können dann einen Link wie /reviews/1/edit zu Web-API generieren.

Url.RouteUrl(routeName: "EditView", routeValues: new { httpRoute = true, reviewId = 1 }); 

oder

Url.HttpRouteUrl(routeName: "EditView", routeValues: , reviewId = 1) 

Beachten Sie, dass Routennamen müssen explizit angegeben werden und sie sind nicht mehr generiert automatisch wie das, was @Karhgath vorschlägt. Dies war eine Änderung von RC zu RTM-Version.

+3

Also was müsste ich tun, wenn ich diese ID noch nicht kenne (ich möchte sie als Parameter in Javascript verwenden)? –

+0

@Kiran, bist du sicher, dass dies der einzige Weg ist? .. Wenn ja, wie kann ich doppelte Routennamen vermeiden? –

0

umleiten möchten In WebApi2, wenn Sie AttributeRouting verwenden, werden Routennamen standardmäßig Controller.Action benannt, aber Sie könnten angeben ein RouteName auch:

[RoutePrefix("reviews")] 
public class ReviewsController : Controller 
{ 
    // The route name is defaulted to "Reviews.Index" 
    [Route] 
    public ActionResult Index() { ... } 

    // The route name is "ShowReviewById" 
    [Route("{reviewId}"), RouteName("ShowReviewById")] 
    public ActionResult Show(int reviewId) { ... } 

    // The route name is by default "Reviews.Edit" 
    [Route("{reviewId}/edit")] 
    public ActionResult Edit(int reviewId) { ... } 

Dann ist es in der Ansicht aufrufen müssen Sie nur den Routennamen setzen und die Parameter als anonymes Objekt senden:

// Outputs: /reviews/123 
@Url.Action("ShowReviewById", new { reviewId = 123 }) 
// Outputs: /reviews/123/edit 
@Url.Action("Reviews.Edit", new { reviewId = 123 }) 
+0

siehe meine Bearbeitung für weitere Informationen ^^ –

+0

Nun, ich dachte, es war klar von oben, aber ich aktualisiert die Antwort, um das Beispiel der Bearbeitungsroute aufzunehmen. Wenn das nicht klar ist, hätte ich gerne mehr Informationen von dir. – Karhgath

+0

Ja, ich vermasselte das Beispiel (ich dachte, es wäre ein API-Controller, aber ich habe ein MVC-Beispiel kopiert). Meine Frage bleibt jedoch, wie kann ich die URL in Web-API bekommen? –

3

Wenn Route mit Attributen ich in der Lage war, den Weg eines WebApi2 Controller aus einer MVC-Ansicht mit so etwas wie dieses zu erhalten:

Url.HttpRouteUrl("RouteName", new { }) 
Verwandte Themen