Domanda

Ho il seguente ActionLink a mio avviso

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

e crea il seguente URL http://mywebsite.com/Controller/Action

Di 'aggiungo un ID alla fine in questo modo: http://mywebsite.com/Controller/Action / 53 e selezionare la pagina. In questa pagina ho la marcatura ho specificato sopra. Ora, quando guardo l'URL crea assomiglia a questo:

http://mywebsite.com/Controller/Action/53 (notare l'aggiunta di l'ID)

Ma voglio per rimuovere l'ID e guardare come ha fatto in origine, come questo http://mywebsite.com / controller / Azione (notare senza ID qui)

Tutte le idee come posso risolvere questo problema? Non voglio usare gli URL hard coded dal mio controller / azioni può cambiare.

È stato utile?

Soluzione

La soluzione consiste nello specificare i miei valori di percorso (il terzo parametro di seguito)

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

Altri suggerimenti

Sembra che è necessario registrare un secondo "solo l'azione" percorso e utilizzare Html.RouteLink (). In primo luogo registrare un percorso come questo in te applicazione di avvio:

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

Poi, invece di ActionLink per creare quei collegamenti utilizzano:

Html.RouteLink("About","ActionOnly")

Il problema è il costruito nel metodi di prendere l'input dall'URL siete attualmente così come quello che si fornisce. Si potrebbe provare questo:

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

Questo dovrebbe pulire manualmente il parametro id.

Non so perché, ma non ha funzionato per me (forse a causa della MVC2 RC). Creato UrlHelper method =>

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

Se uno non si sa quali valori è necessario essere sovrascritto esplicitamente o se si vuole solo per evitare la lista supplementare di parametri è possibile utilizzare un metodo di estensione come il seguente.

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

I dettagli di implementazione sono href="http://blog.greatrexpectations.com/?p=622" in questo post del blog

I esplicitamente impostato il nome dell'azione come "Azione /". Sembra un po 'come un hack, ma è una soluzione rapida.

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

Un altro modo è quello di utilizzare ActionLink (HtmlHelper, String, String, RouteValueDictionary) di sovraccarico, poi ci sono non c'è bisogno di mettere nulla nell'ultimo parametro

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

I sovraccarichi di Html.ActionLink vengono modificate sulle versioni successive di MVC. Su MVC 5 e superiori. Questo è il modo per fare questo:

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

Nota ho superato "" per il parametro id e nullo per HTMLATTRIBUTES.

mi serviva il mio link di menu per essere dinamico. Invece di implementare un sacco di codice in più e di routing per ogni singola semplice pagina che ho rinunciato a l'helper HTML.

<a href="@(item.websiteBaseURL)/@(item.controller)/@(item.ViewName)">@item.MenuItemName</a>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top