2013-08-15 5 views
10

Per creare un collegamento a Controller/A/<anId> faccio questo:Come miglior collegamento a un controller di API

@Html.ActionLink(anId, "Action", "Controller", new {id = anId}) 

azione è sottolineata da ReSharper e posso navigare con F12.

Ma hanno un collegamento a un controller di api:

@Html.ActionLink("API Version", "../api/controller/", new {id = anId}) 

Questo non ha un'opzione di navigazione ReSharper e non ha intenzione di refactoring se cambio titolo il controller. C'è un modo più semplice per collegarsi a un APIController da una vista da rasoio? In particolare, un Resharper riconosce.

risposta

5

In realtà è necessario aggiornare i percorsi API, poiché l'API per impostazione predefinita non include un'azione.

Quindi aggiungere questo percorso:

config.Routes.MapHttpRoute(
    name: "ActionRoute", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

È possibile quindi creare un collegamento in questo modo:

@Url.RouteUrl("ActionRoute", new {httproute= "", controller = "controller", action = "action"}); 

EDIT

Ho riletto la tua domanda e doesn Non dico nulla su un'azione, quindi ho solo pensato che, comunque, puoi ancora usare @Url.RouterUrl:

@Url.RouteUrl("DefaultApi", new {httproute= "", controller = "controller"}); 
+0

Buona risposta. Annotare l'errore di battitura per RouteParameter (non RouterParameter). – iCode

3

Non so circa ReSharper, ma si potrebbe fare questo:

@Html.ActionLink(
    "API Version", 
    "Action", 
    "Controller", 
    new { id = anId, httproute = "" }, 
    null 
) 

Se si passa httproute = "", l'assistente genererà un URL al controller API utilizzando le sue definizioni di routing.

+0

Ho dovuto utilizzare un sovraccarico alternativo (rivedere modifica), ma il collegamento che ottengo è 'http: // localhost: 64404/Controller/Action/anId' Nessuna menzione di' api'. – weston

+0

Quando l'ho usato come dici tu ottengo link 'http: // localhost: 64404/source/Action? Length = 10' – weston

+0

Il più vicino finora:' @ Html.ActionLink ("Versione API", null, new {id = Model.Id.Name, httproute = ""}) 'yields:' http: // localhost: 64404/api/controller/anId? Action = detail' – weston

8

Come altre risposte hanno suggerito già, è possibile utilizzare il Url.RouteUrl in questo modo:

@Url.RouteUrl("DefaultApi", new {httproute= "", controller = "MyApiController"}); 

È inoltre possibile utilizzare il metodo di scelta rapida Url.HttpRouteUrl invece in questo modo:

@Url.HttpRouteUrl("DefaultApi", new { controller = "MyApiController" }) 

"DefaultApi" è il nome di instradamento predefinito quando si crea un nuovo progetto WebApi. Questa stringa deve corrispondere a qualsiasi nome che hai fornito con HttpRoute nel file WebApiConfig.cs.

Entrambe queste soluzioni ti aiuteranno solo a generare l'URL del percorso, in realtà non generano un link HTML per te. È necessario utilizzare loro come questo:

<a href="@Url.HttpRouteUrl("DefaultApi", new { controller = "MyApiController" })">My Link Text</a> 

Se si desidera Razor per generare il tag di ancoraggio HTML per voi, è possibile utilizzare questo metodo invece:

@Html.RouteLink("My Link Text", "DefaultApi", new { controller = "MyApiController" }) 

Questo metodo fornisce un'interfaccia molto simile a @Html.ActionLink che viene utilizzato per i normali collegamenti Controller/Azione.

Tutte queste soluzioni consentono al click-through di funzionare con ReSharper.

+0

Mi piace questa soluzione in quanto elimina la necessità del parametro httproute = "" esplicito. –

+0

@ Html.RouteLink() non fornisce l'URL corretto. L'ho verificato in MVC 5 – yogihosting

Problemi correlati