web-dev-qa-db-fra.com

asp.net mvc Html.ActionLink () en gardant la valeur de route que je ne veux pas

J'ai le lien ActionLink suivant à mon avis

<%= Html.ActionLink("LinkText", "Action", "Controller"); %>

et il crée l'URL suivante http://mywebsite.com/Controller/Action

Supposons que j'ajoute un ID à la fin, comme suit: http://mywebsite.com/Controller/Action/53 et que vous accédez à la page. Sur cette page, j'ai le balisage que j'ai spécifié ci-dessus. Maintenant, quand je regarde l'URL qu'il crée, ça ressemble à ceci:

http://mywebsite.com/Controller/Action/53 (notez l'ajout de l'ID)

Mais je veux qu'il supprime l'ID et ressemble à ce qu'il a été à l'origine, comme ceci http://mywebsite.com/Controller/Action (notez aucun ID ici)

Des idées comment je peux résoudre ce problème? Je ne souhaite pas utiliser d'URL codées en dur car mon contrôleur/mes actions peuvent changer.

43
codette

La solution consiste à spécifier mes propres valeurs d'itinéraire (le troisième paramètre ci-dessous)

<%= Html.ActionLink("LinkText", "Action", "Controller", 
    new { id=string.Empty }, null) %>
44
codette

Il semble que vous deviez enregistrer un deuxième itinéraire "Action uniquement" et utiliser Html.RouteLink (). Commencez par enregistrer un itinéraire comme celui-ci au démarrage de votre application:

routes.MapRoute("ActionOnly", "{controller}/{action}", 
   new { controller = "Home", action = "Index" } );

Ensuite, au lieu d’ActionLink pour créer ces liens, utilisez:

Html.RouteLink("About","ActionOnly")
12
Brian Cauthon

Le problème est que les méthodes intégrées prennent les entrées de l'URL sur laquelle vous vous trouvez, ainsi que de ce que vous fournissez. Vous pouvez essayer ceci:

<%= Html.ActionLink("LinkText", "Action", "Controller", new { id = ""}) %>

Cela devrait effacer manuellement le paramètre id.

10
Garry Shutler

J'ai explicitement défini le nom de l'action comme "Action /". On dirait un peu comme un bidouillage mais c'est une solution rapide.

@Html.ActionLink("Link Name", "Action/", "Controller")
4
BorgRebel

Je ne sais pas pourquoi, mais ça n'a pas fonctionné pour moi (peut-être à cause de Mvc2 RC) Méthode urlhelper créée =>

 public static string
            WithoutRouteValues(this UrlHelper helper, ActionResult action,params string[] routeValues)
        {
            var rv = helper.RequestContext.RouteData.Values;
            var ignoredValues = rv.Where(x=>routeValues.Any(z => z == x.Key)).ToList();
            foreach (var ignoredValue in ignoredValues)
                rv.Remove(ignoredValue.Key);
            var res = helper.Action(action);
            foreach (var ignoredValue in ignoredValues)
                rv.Add(ignoredValue.Key, ignoredValue.Value);
            return res;
        }
4
Arnis Lapsa

Si vous ne savez pas quelles valeurs doivent être explicitement remplacées ou si vous voulez simplement éviter la liste supplémentaire de paramètres, vous pouvez utiliser une méthode d'extension comme celle ci-dessous.

<a href="@Url.Isolate(u => u.Action("View", "Person"))">View</a>

Les détails de la mise en œuvre sont dans cet article de blog

4
Steve Greatrex

Une autre méthode consiste à utiliser la surcharge ActionLink (HtmlHelper, String, String, RouteValueDictionary). Il n'est pas nécessaire de mettre null dans le dernier paramètre

<%= Html.ActionLink("Details", "Details", "Product", new RouteValueDictionary(new { id=item.ID })) %>
2
Murilo Lima

Les surcharges de Html.ActionLink sont modifiées sur les dernières versions de MVC. Sur MVC 5 et ci-dessus. Voici comment faire ceci:

@Html.ActionLink("LinkText", "Action", "Controller", new { id = "" }, null)

Remarque J'ai passé "" pour le paramètre id et null pour HTMLATTRIBUTES. 

1
yogihosting

J'avais besoin que mes liens de menu soient dynamiques. Plutôt que d’implémenter beaucoup de code et de routage supplémentaires pour chaque page, je me suis simplement contenté de l’aide HTML.

<a href="@(item.websiteBaseURL)/@(item.controller)/@(item.ViewName)">@item.MenuItemName</a>
0
nuander