2010-04-26 20 views
7

ASP.NET MVC: ¿puedo tener varios nombres para la misma acción?ASP.NET MVC: ¿puedo tener varios nombres para la misma acción?

En el mismo controlador ... ¿Puedo tener varios nombres para la misma acción?

Estoy buscando una solución completa de múltiples idiomas. Esencialmente, quiero que toda la lógica sea igual, pero cambie las "palabras clave" (acciones, controladores en la url) según el idioma.

+0

¿No pudo establecer Thread.CurrentThread.CurrentCulture, Thread.CurrentThread.CurrentUICulture en su lugar? http://msdn.microsoft.com/en-us/library/bz9tc508.aspx –

Respuesta

7

No puede haber varios nombres para la misma acción. Serán diferentes acciones. Esta es la forma en que funciona mvc. Mabe es mejor implementar el comportamiento descrito con el enrutamiento.

routes.MapRoute("Lang1RouteToController1Action1", 
"Lang1Controller/Lang1Action/{id}", 
new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

routes.MapRoute("Lang2RouteToController1Action1", 
"Lang2Controller/Lang2Action/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

Por supuesto que tendrá que crear muchas rutas, pero se puede hacer el archivo de configuración o almacén de datos en la base de datos de enrutamiento, y acaba de crear en bucle al iniciar la aplicación. De todos modos, creo que es mejor que crear una variedad de métodos, porque si quieres agregar un idioma más necesitarás encontrar acciones en todos tus controladores y volver a compilar el código. Pero en el caso de las rutas y el archivo de configuración, no se vuelve tan difícil. Lo segundo es la extensión Html.ActionLink ("Inicio", "Índice", "Inicio"): deberá implementar la suya para devolver el enlace de acción localizado.

+0

También tuve esta idea, después de publicar. ¿Crees que puedo tener diferentes nombres de acción para llamar a la misma clase para hacer algo y tener estas clases (lógica de acción) en un archivo diferente? – unmircea

+0

Sí, puedes. Pero como ya dije, esto causará mucho dolor cuando desees agregar un nuevo idioma. Además, parecerá extraño ver en los métodos de código nombrados en diferentes idiomas y hacer lo mismo. Realmente creo que el enrutamiento será mucho más apropiado en tu caso, ya que usa cadenas. Y cada tyme localizamos algo - localizamos cadenas - no nombres de los métodos. Pero es solo mi opinión :) –

2

No estoy seguro si es posible tener múltiples nombres de acción. Una forma en que podría pensar en hacer esto es definiendo múltiples acciones con diferentes nombres que cal/ejecutan la misma acción internamente.

+0

¡Bonita solución! Pero la url "final" que se produce tendrá el nombre de la acción "principal" que todas las demás acciones invocan. – unmircea

+0

No lo creo. No estoy sugiriendo una redirección a otra acción. Simplemente puede ejecutar otra acción (que es otro método público en la clase de controlador) y devolver su resultado al navegador mientras ejecuta una acción. – Roman

+0

Ok ... Ahora lo entiendo. Simplemente "envuelvo" la acción de "otro idioma" alrededor de una acción genérica, ambos "haciendo" lo mismo Esto parece lógico :) – unmircea

2

Sé que voy tarde a la fiesta, pero en caso de que alguien está en googlear, he creado un atributo (atributo inspirado en ActionName) que coincide con varios nombres de la siguiente manera:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Reflection; 
using System.Web.Mvc; 

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public class ActionNamesAttribute : ActionNameSelectorAttribute 
{ 
    public ActionNamesAttribute(params string[] names) 
    { 
     if (names == null) { 
      throw new ArgumentException("ActionNames cannot be empty or null", "names"); 
     } 
     this.Names = new List<string>(); 
     foreach (string name in names) 
     { 
      if (String.IsNullOrEmpty(name)) 
      { 
       throw new ArgumentException("ActionNames cannot be empty or null", "names"); 
      } 
      this.Names.Add(name); 
     } 
    } 

    private List<string> Names { get; set; } 

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) 
    { 
     return this.Names.Any(x => String.Equals(actionName, x, StringComparison.OrdinalIgnoreCase)); 
    } 
} 

de usar:

[ActionNames("CreateQuickItem", "CreateFullItem")] 
public ActionResult Create() {} 
Cuestiones relacionadas