En ASP.NET MVC, tenemos @Url.Actionacciones. ¿Hay algo similar como @Url.Apique se enrutaría a / api / controller?
En ASP.NET MVC, tenemos @Url.Actionacciones. ¿Hay algo similar como @Url.Apique 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 DefaultApia 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.UrlHelperpara generar rutas Api fuera de un HttpControllerContext.
Funciona con la forma más simple de, Url.Actionpor 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.Actionse está utilizando desde una Vista. Urles de tipo System.Web.Mvc.UrlHelpery no se asigna a WebApirutas. 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.