2010-01-08 21 views
30

Usando la ruta predeterminada provista, me veo forzado a nombrar mis parámetros "id". Eso está bien para muchas de mis acciones de controlador, pero quiero usar un mejor nombre de variable en ciertos lugares. ¿Existe algún tipo de atributo que pueda usar para poder tener nombres de variables más significativos en mis firmas de acción?Nombramiento de parámetro de acción

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

// Action Signature: 
public ActionResult ByAlias(string alias) 
{ 
    // Because the route specifies "id" and this action takes an "alias", nothing is bound 
} 

Respuesta

48

Utilice el [lazo] atributo:

public ActionResult ByAlias([Bind(Prefix = "id")] string alias) { 
    // your code here 
} 
+1

¡Ese es el mejor ejemplo de uso de Bind que he encontrado todavía! ¿Hay alguna manera de hacer que esto también funcione en las propiedades del modelo? es decir, en lugar de que la firma del método tenga un parámetro de cadena, tiene una clase como parámetro que tiene una propiedad que se ve así: '[Enlazar (Prefijo =" id ")] cadena Alias ​​{obtener; establecer;} '? Ese ejemplo no compila ... ¿cómo lo modificaría para compilar (y también funcionar)? –

0

Esto todavía funciona, su cadena de consulta sólo se verá como "/ Controlador/ByAlias? Alias ​​= algo".

+0

supongo que usted está diciendo que todavía funciona es decir, si en realidad había utilizado a Html.ActionLink crear mi enlace, entonces crearía una URL como usted ha descrito ... ¿qué pasa si no hice eso y solo presiono la URL/Controlador/ByAlias ​​/ aliashere - de alguna manera puedo vincular el parámetro de alias de cadena al " id "pieza definida en la ruta? – Langdon

+0

En mi versión de MVC, eso no funcionó. Esperaba estrictamente/{id} - no podía proporcionar? Alias ​​= val – mmcrae

0

Puede personalizar las rutas con cualesquiera identificadores que le gustan ..

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

Editar:Here's an overview from the ASP.NET site

+0

Estoy seguro, pero si todavía quiero que el/Home/Index/id original funcione, no puedo definir bien/Home/Index/alias right después de eso y esperar que alguna vez sea golpeado. – Langdon

0

hecho de que su ruta utiliza el nombre "id" para la variable de identificación no significa que debe usar el mismo nombre en los métodos de acción de su controlador.

Por ejemplo, dado que este método controlador ...

public Controller MailerController 
{ 
    public ActionResult Details(int mailerID) 
    { 
     ... 
     return View(new { id = mailerID }); 
    } 
} 

... y este método de acción llamada desde el punto de vista ...

<%= Html.ActionLink("More Info", "Details", new { mailerID = 7 }) %> 

... se puede utilizar cualquier denominación convención que desea para el parámetro ID en los métodos de acción de su controlador. Todo lo que necesita hacer es resolver el nuevo nombre con el valor predeterminado, ya sea "id", "alias" o lo que sea.

el ejemplo anterior se debe resolver a:

<a href="/Mailer/Details/7">More Info</a> 
+2

Para mí (en MVC 1.0) mailerID siempre dará como resultado nulo si presiono/Mailer/Details/7. Tan pronto como cambio int mailerID a int id (según la ruta) funciona bien. – Langdon

+3

usando 'id' le permite generalizar sus rutas. Sin esto, necesitarías una ruta para cada variación de nombre de identificación. –

Cuestiones relacionadas