2012-02-29 55 views

Respuesta

123

El ApiController tiene una propiedad llamada Url que es del tipo System.Web.Http.Routing.UrlHelper que le permite construir urls para controladores api.

Ejemplo:

public class ValuesController : ApiController 
{ 
    // GET /api/values 
    public IEnumerable<string> Get() 
    { 
     // returns /api/values/123 
     string url = Url.Route("DefaultApi", new { controller = "values", id = "123" }); 
     return new string[] { "value1", "value2" }; 
    } 

    // GET /api/values/5 
    public string Get(int id) 
    { 
     return "value"; 
    } 

    ... 
} 

no existe Este UrlHelper ni en sus puntos de vista ni en los controladores estándar.


ACTUALIZACIÓN:

Y con el fin de hacer enrutamiento exterior de un ApiController que podría hacer lo siguiente:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     string url = Url.RouteUrl(
      "DefaultApi", 
      new { httproute = "", controller = "values", id = "123" } 
     ); 
     return View(); 
    } 
} 

o dentro de un punto de vista:

<script type="text/javascript"> 
    var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "values", id = "123" })'; 
    $.ajax({ 
     url: url, 
     type: 'GET', 
     success: function(result) { 
      // ... 
     } 
    }); 
</script> 

Aviso del httproute = "" token de ruta, que es importante.

Obviamente, esto asume que la ruta Api se llama DefaultApi en su método RegisterRoutes en Global.asax:

routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 
+0

Eso ... realmente no me sirve de mucho ya que necesito mi Vista para poder generar Urls de forma segura. Si hay una licencia de Go Live, ¿cuál es la forma de 'Activar' para crear URL en la Vista? –

+0

Más importante aún, esto no funcionará si está utilizando ASP.Net Development Server, ya que cambia de puerto todo el tiempo, por lo que no puede ni siquiera dañar la url en la vista. –

+0

@ShaneCourtrille, he actualizado mi respuesta para ilustrar cómo se puede usar el 'System.Web.Mvc.UrlHelper' normal para generar rutas Api fuera de un HttpControllerContext. –

41

Funciona con la forma más simple de Url.Action por lo tanto usted no tiene que hacer referencia a los nombres de enrutamiento:

Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" }) 

Es posible que desee agregar un area = "" si la URL es necesaria dentro de un Área. (Los controladores Api están fuera de Areas por defecto.) Estoy usando MVC 4.

+7

El UrlHelper en Web Api es http: // msdn.microsoft.com/en-us/library/system.web.http.routing.urlhelper(v=vs.108).aspx, no tiene un método de acción. –

+6

@YuriyFaktorovich Esta publicación implica que 'Url.Action' se está utilizando desde una Vista. 'Url' es del tipo' System.Web.Mvc.UrlHelper', y no se asigna a las rutas 'WebApi'. Es por eso que necesita el parámetro adicional: 'new {httproute =" "}'. – Jesse

+3

Agregué 'httproute" "' pero no está mapeando =/ – Maslow

4

¿Desea poder generar enlaces de forma segura, sin cadenas codificadas (nombres de controlador)?

¡Hay un nuget para eso!(Y está escrito por Mark Seeman)

https://github.com/ploeh/Hyprlinkr

funciona así:

rutas, como de costumbre:

name: "API Default", 
routeTemplate: "api/{controller}/{id}", 
defaults: new { id = RouteParameter.Optional } 

obtener una URL:

var linker = new RouteLinker(request); 
var uri = linker.GetUri<FooController>(r => r.GetById(1337)); 

Resultado:

http://localhost/api/foo/1337 
0

Aquí es el método de KISS para responder a la pregunta: ¿

Si este es el código que se usaría para crear una URL controlador MVC

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

Con el fin de obtener una URL de la API versión del controlador (suponiendo que se utiliza el mismo nombre de controlador) que puede utilizar

@Url.Action("Edit", "api/MyController") 

Todo el método Url.Action está haciendo es anexar la ruta raíz de la aplicación, con el c nombre del ontroller, seguido del nombre de la acción (a menos que sea "Index", en cuyo caso no se agrega). si el objeto de valores de ruta tiene una propiedad de id, el valor también se agrega a la URL.