asp.net-mvc - pass - asp-controller asp-action parameter
¿Hay alguna manera de incluir un identificador de fragmento cuando se usa Asp.Net MVC ActionLink, RedirectToAction, etc.? (7)
Quiero algunos enlaces para incluir un identificador de fragmento. Como algunas de las URL en este sitio:
Depuración: IE6 + SSL + AJAX + formulario de publicación = 404 error # 5626
¿Hay alguna manera de hacerlo con cualquiera de los métodos integrados en MVC? ¿O tendría que rodar mis propios ayudantes de HTML?
@Dominic,
Estoy casi seguro de que poner eso en la ruta causará problemas de enrutamiento.
@Ricky,
Hasta que MVC tenga soporte para esto, puede ser un poco más "viejo" sobre cómo hacer sus rutas. Por ejemplo, puedes convertir:
<%= Html.ActionLink("Home", "Index") %>
dentro:
<a href=''<%= Url.Action("Index") %>#2345''>Home</a>
O puede escribir su propio ayudante que hace esencialmente lo mismo.
Estamos buscando incluir soporte para esto en nuestro próximo lanzamiento.
La respuesta corta es: No. En ASP.NET MVC Preview 3 no hay una forma de primera clase para incluir un ancla en un enlace de acción. A diferencia de los url_for: anchor de Rails, UrlHelper.GenerateUrl (y ActionLink, RedirectToAction y otros que lo usan) no tienen un nombre de propiedad mágico que le permita codificar un delimitador.
Como usted señala, podría enrollar el suyo que sí lo haga. Esta es probablemente la solución más limpia.
Hackily, podrías incluir un ancla en una ruta y especificar el valor en el hash de tus parámetros:
routes.MapRoute("WithTarget", "{controller}/{action}/{id}#{target}");
...
<%= Html.ActionLink("Home", "Index", new { target = "foo" })%>
Esto generará una URL como / Home / Index / # foo. Lamentablemente, esto no funciona bien con los parámetros de URL, que aparecen al final de la URL. Por lo tanto, este truco solo es factible en circunstancias realmente simples en las que todos los parámetros aparecen como componentes de ruta de URL.
Esta es una solución del lado del cliente, pero si tiene jquery disponible, puede hacer algo como esto.
<script language="javascript" type="text/javascript">
$(function () {
$(''div.imageHolder > a'').each(function () {
$(this).attr(''href'', $(this).attr(''href'') + ''#tab-works'');
});
});
</script>
Los identificadores de fragmentos son compatibles con MVC 5. Vea las sobrecargas de ActionLink
en https://msdn.microsoft.com/en-us/library/dd460522(v=vs.118).aspx y https://msdn.microsoft.com /en-us/library/dd492938(v=vs.118).aspx .
En MVC3 (y posiblemente antes no lo he comprobado), puede usar UrlHelper.GenerateUrl pasando el parámetro de fragmento. Aquí hay un método de ayuda que utilizo para ajustar la funcionalidad
public static string Action(this UrlHelper url, string actionName, string controllerName, string fragment, object routeValues)
{
return UrlHelper.GenerateUrl(
routeName: null,
actionName: actionName,
controllerName: controllerName,
routeValues: new System.Web.Routing.RouteValueDictionary(routeValues),
fragment: fragment,
protocol: null,
hostName: null,
routeCollection: url.RouteCollection,
requestContext: url.RequestContext,
includeImplicitMvcValues: true /*helps fill in the nulls above*/
);
}
Como escribió Brad Wilson, puedes construir tu propio enlace en tus vistas simplemente concatenando cadenas. Pero para agregar un nombre de fragmento a un redireccionamiento generado a través de RedirectToAction (o similar) necesitará algo como esto:
public class RedirectToRouteResultEx : RedirectToRouteResult {
public RedirectToRouteResultEx(RouteValueDictionary values)
: base(values) {
}
public RedirectToRouteResultEx(string routeName, RouteValueDictionary values)
: base(routeName, values) {
}
public override void ExecuteResult(ControllerContext context) {
var destination = new StringBuilder();
var helper = new UrlHelper(context.RequestContext);
destination.Append(helper.RouteUrl(RouteName, RouteValues));
//Add href fragment if set
if (!string.IsNullOrEmpty(Fragment)) {
destination.AppendFormat("#{0}", Fragment);
}
context.HttpContext.Response.Redirect(destination.ToString(), false);
}
public string Fragment { get; set; }
}
public static class RedirectToRouteResultExtensions {
public static RedirectToRouteResultEx AddFragment(this RedirectToRouteResult result, string fragment) {
return new RedirectToRouteResultEx(result.RouteName, result.RouteValues) {
Fragment = fragment
};
}
}
Y luego, en su controlador, llamaría:
return RedirectToAction("MyAction", "MyController")
.AddFragment("fragment-name");
Eso debería generar la URL correctamente.