En ASP.NET MVC, tenemos @Url.Action
acciones. ¿Hay algo similar como @Url.Api
que se enrutaría a / api / controller?
En ASP.NET MVC, tenemos @Url.Action
acciones. ¿Hay algo similar como @Url.Api
que se enrutaría a / api / controller?
Respuestas:
El ApiController tiene una propiedad llamada Url que es de tipo System.Web.Http.Routing.UrlHelper que le permite construir URL 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";
}
...
}
Este UrlHelper no existe ni en sus vistas ni en los controladores estándar.
ACTUALIZAR:
Y para hacer el enrutamiento fuera de un ApiController, puede 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 una 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>
Observe el httproute = ""
token de ruta que es importante.
Obviamente, esto supone que se llama DefaultApi
a su ruta Api en su método RegisterRoutes en Global.asax
:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
System.Web.Mvc.UrlHelper
para generar rutas Api fuera de un HttpControllerContext.
Funciona con la forma más simple de, Url.Action
por lo tanto, no tiene que hacer referencia a ningún nombre 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 de API están fuera de las áreas de forma predeterminada). Estoy usando MVC 4.
Url.Action
se está utilizando desde una Vista. Url
es de tipo System.Web.Mvc.UrlHelper
y no se asigna a WebApi
rutas. Esta es la razón por lo que necesita el parámetro adicional: new { httproute = "" }
.
httproute""
pero no es mapeo = /
@Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null)
pero eso funcionó perfectamente
¿Quiere 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
Aquí está el método KISS para responder la pregunta:
Si este es el código que usaría para crear una URL de controlador MVC
@Url.Action("Edit", "MyController")
Para obtener una URL para la versión API del controlador (suponiendo que use el mismo nombre de controlador) puede usar
@Url.Action("Edit", "api/MyController")
Todo lo que hace el método Url.Action es agregar la ruta raíz de la aplicación, con el nombre del controlador, 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 un id propiedad, el valor también se agrega a la URL.
api/
antes de mi nombre de controlador.