Erstellen von url für die Web-Api mit Attribut-routing
Wie bekomme ich die url von der web-api aus meiner Sicht?
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) { ... }
}
Nun will ich bauen "/Bewertungen/Bearbeiten" in meiner Ansicht, wie kann ich dies tun?
Ich habe versucht, erstellen eine kleine Erweiterung Methode, aber es verlangt von mir zu geben, jede Strecke eine tatsächliche "RouteName". Gibt es eine Methode, die ich verwenden kann (wie in MVC) wo kann ich geben Sie nur den controller und die Aktion?
@Url.Action("Edit", "Reviews)
Die Methode, die ich jetzt verwende (mit RouteName) auch mir nicht erlaubt, zu verwenden Ganzzahlen als Parameter (es sei denn ich gebe einen default-Wert). Wenn ich brauche, um alle Namen und alle meine Routen, wie kann ich eine route erstellen url übergeben aber meine Parameter in den "data"-Teil meiner Anfrage?
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);
}
BEARBEITEN
Wenn ich verwendet Methoden wie Url.RouteUrl(new { controller = ..., action = ...})
wird, leitet Es direkt an die Aktion (z.B. new { controller = "Reviews", action = "Show"} --> /reviews/show
, whilest ich will, die Umleitung zu /reviews/...
httproute
verwendet wird, für die Generierung der links zu einer Web-API-controller und nicht-MVC-wie in Ihrem Fall.Das war eine falsche copy/paste, es ist definitiv ein Web-API-controller, nicht auf ein MVC-controller, danke für den Hinweis
InformationsquelleAutor Team-JoKi | 2014-01-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Generierung von links zu Web-API Routen erfordern stets eine
RouteName
, also solltest du so etwas wie unten:Können Sie dann erstellen Sie einen link, wie
/reviews/1/edit
zu Web-API.oder
Beachten Sie, dass die route-Namen müssen explizit angegeben werden und Sie werden nicht mehr automatisch erzeugt, wie das, was @Karhgath suggeriert. Dies war eine änderung, die von RC zu RTM-version.
sind Sie sicher, dass dies der einzige Weg? .. Wenn ja, wie kann ich vermeiden, dass doppelte Strecke-Namen?
Halten Sie Ihre route mit den Namen in einer statischen Klasse wie
RouteNameConstants
oder so etwas. Es wird noch nicht sicherzustellen, dass keine Duplikate, aber zumindest alle die magic-strings wird in einem Ort, und Sie werden nicht kopieren/einfügen von strings um als gut.InformationsquelleAutor Kiran Challa
Bei der Verwendung von route Attribute ich war in der Lage zu Holen Sie sich die route von einem WebApi2 controller aus MVC-Sicht mit so etwas wie dieses:
InformationsquelleAutor voam
In WebApi2 bei der Verwendung AttributeRouting, route-Namen benannt sind standardmäßig
Controller.Action
, aber Sie könnte geben Sie eineRouteName
auch:Dann rufen Sie in der Ansicht Sie müssen nur den Namen der route ein und senden Sie die Parameter wie ein anonymes Objekt:
Gut, ich dachte es war klar aus den oben genannten, aber ich aktualisiert, die Antwort zu beinhalten, die route Bearbeiten Beispiel. Wenn das nicht klar, ich hätte gerne mehr Informationen von Ihnen.
Ja, ich Durcheinander mit dem Beispiel (ich dachte, es war ein API-controller, aber kopiert habe ich ein MVC-Beispiel). Meine Frage bleibt aber, wie bekomme ich die Url in der web-API?
Nicht @Url.Aktion("Reviews.Edit", new { reviewId = 123 })?? (sollte eine url auf "/Bewertungen/123/edit"), Wenn über Attribut-Routing, Routing-Namen generiert werden standardmäßig mit einem Namen wie "Controller.Aktion", so "Bewertungen."Bearbeiten" sollte aber funktionieren, nicht? Ich vermute, ich bin nicht zu verstehen, das eigentliche problem, die Sie haben.
die
@Url.Action("Reviews.Edit", new { reviewId = 123 })
mit anonymen Attribut nicht funktioniert.InformationsquelleAutor Karhgath