Existe-t-il un moyen d'inclure un identifiant de fragment lors de l'utilisation d'Asp.Net MVC ActionLink, RedirectToAction, etc. ?

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

  •  08-06-2019
  •  | 
  •  

Question

Je souhaite que certains liens incluent un identifiant de fragment.Comme certaines des URL de ce site :

Débogage :IE6 + SSL + AJAX + formulaire de publication = erreur 404#5626

Existe-t-il un moyen de le faire avec l'une des méthodes intégrées dans MVC ?Ou devrais-je lancer mes propres assistants HTML ?

Était-ce utile?

La solution

Nous envisageons d'inclure cette prise en charge dans notre prochaine version.

Autres conseils

Comme l'a écrit Brad Wilson, vous pouvez créer votre propre lien dans vos vues en concaténant simplement des chaînes.Mais pour ajouter un nom de fragment à une redirection générée via RedirectToAction (ou similaire), vous aurez besoin de quelque chose comme ceci :

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
        };
    }
}

Et puis, dans votre contrôleur, vous appelleriez :

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

Cela devrait générer l'URL correctement.

Dans MVC3 (et peut-être plus tôt, je n'ai pas vérifié), vous pouvez utiliser UrlHelper.GenerateUrl en passant le paramètre fragment.Voici une méthode d'assistance que j'utilise pour envelopper la fonctionnalité.

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

@Dominique,

Je suis presque sûr que mettre cela dans l'itinéraire entraînera des problèmes de routage.

@Ricky,

Jusqu'à ce que MVC prenne en charge cela, vous pouvez être un peu plus « vieille école » sur la façon dont vous créez vos itinéraires.Par exemple, vous pouvez convertir :

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

dans:

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

Ou vous pouvez écrire votre propre assistant qui fait essentiellement la même chose.

La réponse courte est :Non.Dans ASP.NET MVC Preview 3, il n'existe aucun moyen efficace d'inclure une ancre dans un lien d'action.Contrairement à url_for :anchor de Rails, UrlHelper.GenerateUrl (et ActionLink, RedirectToAction et ainsi de suite qui l'utilisent) n'ont pas de nom de propriété magique qui vous permet d'encoder une ancre.

Comme vous le faites remarquer, vous pouvez rouler le vôtre.C'est probablement la solution la plus propre.

Hackily, vous pouvez simplement inclure une ancre dans une route et spécifier la valeur dans le hachage de vos paramètres :

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

Cela générera une URL comme /Home/Index/#foo.Malheureusement, cela ne fonctionne pas bien avec les paramètres d'URL, qui apparaissent à la fin de l'URL.Ce hack n'est donc réalisable que dans des circonstances très simples où tous vos paramètres apparaissent en tant que composants de chemin d'URL.

Il s'agit d'une solution côté client, mais si jquery est disponible, vous pouvez faire quelque chose comme ceci.

<script language="javascript" type="text/javascript">
    $(function () {
        $('div.imageHolder > a').each(function () {
            $(this).attr('href', $(this).attr('href') + '#tab-works');
        });
    });
</script>

Les identifiants de fragment sont pris en charge dans MVC 5.Voir ActionLinkles surcharges à https://msdn.microsoft.com/en-us/library/dd460522(v=vs.118).aspx et https://msdn.microsoft.com/en-us/library/dd492938(v=vs.118).aspx.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top