2011-09-21 8 views
10

ho questo percorso definito:ActionLink per mostrare i parametri in URL invece di querystring?

routes.MapRoute(
        "Details", // Route name 
        "{home}/{details}/{id}/{name}", // URL with parameters 
        new 
        { 
         controller = "Home", 
         action = "Details", 
         id = UrlParameter.Optional, 
         name = UrlParameter.Optional 
        } // Parameter defaults 
       ); 

L'ActionLink:

@Html.ActionLink("Show Details", "Details", "MyController", new { id = 1, name ="a" }) 

I risultati ActionLink in /Home/Details/1?name=a Sono dopo /Home/List/1/a

risposta

12

tua definizione percorso dovrebbe essere simile a questo:

routes.MapRoute(
    "Details", // Route name 
    "{controller}/{action}/{id}/{name}", // URL with parameters 
    new 
    { 
     controller = "Home", 
     action = "Details", 
     id = UrlParameter.Optional, 
     name = UrlParameter.Optional 
    } // Parameter defaults 
); 

Inoltre si dovrebbe utilizzare il proper overload:

@Html.ActionLink(
    "Show Details",    // linkText 
    "Details",     // action 
    "MyController",    // controller 
    new { id = 1, name = "a" }, // routeValues 
    null      // htmlAttributes 
) 

Avviso del null alla fine.

+1

L'ActionLink ha funzionato bene quando la rotta sopra è stato aggiunto prima che il percorso di default. Tuttavia, il valore predefinito ora va a/Home/Dettagli – Danny

1

un ipotesi:

probabilmente il percorso è stato registrato dopo il percorso di default. Mettilo come prima via all'interno del tuo global.asax allora funzionerà.

come di seguito:

public static void RegisterRoutes(RouteCollection routes) { 

     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
          "Details", // Route name 
          //Put action instead of details 
          "{home}/{action}/{id}/{name}", // URL with parameters 
          new 
          { 
           controller = "Home", 
           action = "Details", 
           id = UrlParameter.Optional, 
           name = UrlParameter.Optional 
          } // Parameter defaults 
         ); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

    } 

UPDATE

@Simon è corretto, ma è possibile utilizzare un altro modo, se si desidera.

Per utilizzare la rotta solo per un metodo di azione, utilizzare il seguente codice.

Creare un vincolo come segue:

public class EqualConstraint : IRouteConstraint { 

    private string _match = String.Empty; 

    public EqualConstraint(string match) { 

     _match = match; 
    } 

    public bool Match(System.Web.HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { 

     return string.Equals(values[parameterName].ToString(), _match); 
    } 
} 

e quindi modificare il percorso come di seguito:

routes.MapRoute(
         "Details", // Route name 
         //Put action instead of details 
         "{home}/{action}/{id}/{name}", // URL with parameters 
         new 
         { 
          controller = "Home", 
          action = "Details", 
          id = UrlParameter.Optional, 
          name = UrlParameter.Optional 
         }, // Parameter defaults 
         new { 
          controller = new EqualConstraint("Home"), 
          action = new EqualConstraint("Details") 
         } 
        ); 
+0

Vedere il mio commento a Darin – Danny

+0

@Danny cosa intendi con "il valore predefinito ora va a/Home/Dettagli"? – tugberk

+0

Quando l'applicazione inizia, passa a/Home/Dettagli invece della rotta predefinita/Home/Index – Danny

Problemi correlati