2008-08-08 5 views

Respuesta

5

Estamos buscando incluir soporte para esto en nuestro próximo lanzamiento.

+0

¿Va a apuntar para ser lanzado en el dev10? – ajma

1

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, puede hacer las suyas que sí lo hacen. Esta es probablemente la solución más limpia.

Hackily, sólo podría incluir un ancla en una ruta y especificar el valor de hash en su parámetros:

routes.MapRoute("WithTarget", "{controller}/{action}/{id}#{target}"); 
... 
<%= Html.ActionLink("Home", "Index", new { target = "foo" })%> 

Esto generará una URL como/Home/Índice/# 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.

+1

No funciona. El # se transforma en% 23. – jpbochi

3

@Dominic,

estoy casi seguro de que la puesta en que la ruta va a causar problemas de enrutamiento.

@Ricky,

Hasta MVC tiene soporte para esto, que puede ser un poco más "vieja escuela" sobre cómo hacer sus rutas. Por ejemplo, se puede convertir:

<%= Html.ActionLink("Home", "Index") %> 

en:

<a href='<%= Url.Action("Index") %>#2345'>Home</a> 

O puede escribir su propio ayudante que hace esencialmente la misma cosa.

+1

Probé objetivos en rutas con ASP.NET MVC Preview 3 y no hubo ningún problema con el enrutamiento. Entonces, aunque usted sea "casi positivo", sería útil que se explayara sobre los problemas que surgirán. –

18

Como escribió Brad Wilson, puede construir su propio enlace en sus vistas simplemente concatenando cadenas. Pero para añadir un nombre fragmento de una redirección generado a través de RedirectToAction (o similar) que necesita 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, que se dice:

return RedirectToAction("MyAction", "MyController") 
     .AddFragment("fragment-name"); 

Eso debería generar la URL correctamente.

+3

Esto es genial. En MVC3 hay una sobrecarga en 'ActionLink' que te permite hacer un fragmento, pero no' RedirectToAction'. – kamranicus

+0

Usted, señor, es mi héroe. :) –

0

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> 
4

En MVC3 (y posiblemente antes no lo he comprobado), puede utilizar UrlHelper.GenerateUrl que pasa en el parámetro fragmento.Aquí es un método de ayuda que utilizo para envolver el functionalityL

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*/ 
    ); 
} 
+0

Un poco incómodo, pero es la mejor de las respuestas aquí. Tal vez, los otros están fuera de moda. – jpbochi

Cuestiones relacionadas