2011-09-21 7 views
10

que tienen esta ruta definida:ActionLink para mostrar los parámetros en URL en lugar de 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 
       ); 

El ActionLink:

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

Los resultados ActionLink en /Home/Details/1?name=a yo después de /Home/List/1/a

Respuesta

12

Su definición de la ruta debería ser así:

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

También se debe utilizar el proper overload: Aviso

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

la null al final.

+1

El ActionLink funcionó bien cuando se añadió la ruta anterior antes de la ruta por defecto. Sin embargo, el valor predeterminado ahora es/Inicio/Detalles – Danny

1

una suposición:

probablemente su ruta fue registrado después de la ruta por defecto. Ponlo como la primera ruta dentro de tu global.asax luego funcionará.

, como a continuación:

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

    } 

ACTUALIZACIÓN

@Simon es correcta, pero se puede utilizar otro camino si quieres.

Para que la ruta funcione solo por un método de acción, use el siguiente código.

crea una restricción de la siguiente manera:

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

Y a continuación, cambiar su ruta, como a continuación:

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

Ver mi comentario a Darin – Danny

+0

@Danny ¿qué quiere decir con "el valor predeterminado ahora va a/Inicio/Detalles"? – tugberk

+0

Cuando se inicia la aplicación va a/Inicio/Detalles en lugar de la ruta predeterminada/Inicio/Índice – Danny

Cuestiones relacionadas