Es allí una manera de incluir un identificador de fragmento cuando se utiliza Asp.Net MVC ActionLink, RedirectToAction, etc.?

StackOverflow https://stackoverflow.com/questions/5628

  •  08-06-2019
  •  | 
  •  

Pregunta

Quiero algunos enlaces para incluir un identificador de fragmento.Como algunas de las URLs en este sitio:

Depuración:IE6 + SSL + AJAX + formulario de envío = error 404#5626

Hay una forma de hacerlo con cualquiera de los métodos integrados en MVC?O tengo que rollo mi propio código HTML helpers?

¿Fue útil?

Solución

Estamos mirando incluyendo el apoyo para que este en nuestra próxima versión.

Otros consejos

Como Brad Wilson escribió, usted puede construir su propio enlace en sus puntos de vista por la simple concatenación de cadenas.Pero para añadir un fragmento de nombre a una redirección generado a través de RedirectToAction (o similar) que necesitan 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 el controlador, que se llama:

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

Que debe generar la URL correctamente.

En MVC3 (y posiblemente antes no he comprobado), puede utilizar UrlHelper.GenerateUrl pasando en el fragmento parámetro.He aquí un método que yo uso 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*/
    );
}

@Dominic,

Estoy casi seguro de que al poner en la ruta que va a causar problemas de enrutamiento.

@Ricky,

Hasta MVC tiene soporte para esto, puede ser un poco más de la "vieja escuela" acerca de cómo hacer tus rutas.Por ejemplo, usted puede convertir:

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

en:

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

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

La respuesta corta es:No.En ASP.NET MVC vista previa de 3 no hay de primera clase para la inclusión de un ancla en un enlace de acción.A diferencia de Rails' url_for :ancla, UrlHelper.GenerateUrl (y ActionLink, RedirectToAction y la manera en que lo uso) no tienen una magia en nombre de la propiedad que le permite codificar un ancla.

Como usted señala, usted podría rodar su propio que lo hace.Esta es probablemente la solución más limpia.

Hackily, se podría incluir un ancla en una ruta y especificar el valor de sus parámetros hash:

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 jugar bien con los parámetros de la URL, que aparecen al final de la URL.Así que este hack es sólo viable en muy simple circunstancias donde todos sus parámetros aparecen como URL componentes de la ruta.

Este es un lado de cliente de la solución, pero si usted tiene jquery, puedes 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>

Identificadores de fragmento se admiten en MVC 5.Ver ActionLink's sobrecargas 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top