2010-04-26 120 views
7

ASP.NET MVC - 我可以爲同一個動作使用多個名稱嗎?ASP.NET MVC - 我可以爲同一個動作使用多個名稱嗎?

在同一個控制器中...我可以爲同一個動作使用多個名稱嗎?

我正在尋找完整的多語言解決方案。基本上,我希望所有的邏輯都是相同的,但根據語言改變「關鍵字」(url中的動作,控制器)。

+0

難道你不能設置 而不是Thread.CurrentThread.CurrentCulture,Thread.CurrentThread.CurrentUICulture? http://msdn.microsoft.com/en-us/library/bz9tc508.aspx – 2010-04-26 00:08:46

回答

7

對於相同的操作,您不能有多個名稱。這將是不同的行動。這是mvc如何工作的方式。 Mabe最好用路由實現描述的行爲。

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

Ofcourse,你必須創建多條航線,但你可以配置文件或存儲路由在數據庫中的數據,而只是在應用程序啓動循環創建它們。無論如何,我認爲創建方法更好,因爲如果你想添加一種語言,你需要找到遍佈你的控制器的操作並重新編譯代碼。但是在路由和配置文件的情況下 - 它變得不那麼難。 第二件事是Html.ActionLink(「Home」,「Index」,「Home」)擴展名 - 您必須實現自己的才能返回本地化操作鏈接。

+0

在我張貼後有了這個想法。你認爲我可以有不同的動作名稱調用同一個類來做某件事,並將這些類(動作邏輯)放在不同的文件中? – unmircea 2010-04-26 08:55:43

+0

是的,你可以。但正如我已經說過的,當你希望添加新的語言時,這會帶來很多痛苦。而且,在用不同語言命名的代碼方法中看到同樣的事情看起來很奇怪。我真的認爲,路由將會更適合你的情況,因爲它使用字符串。每一個我們本地化的東西 - 我們本地化字符串 - 不是方法的名稱。但這只是我的意見:) – 2010-04-26 09:27:32

2

我不確定是否有多個操作名稱是可能的。我可以想到的一種方法是通過定義多個具有不同名稱的動作來執行相同的動作。

+0

很好的解決方法!但是生成的「最終」網址將具有每個其他操作調用的「主」操作的名稱。 – unmircea 2010-04-26 00:13:37

+0

我不這麼認爲。我不建議重定向到另一個行動。您可以簡單地執行另一個操作(這是控制器類中的另一個公共方法),並在執行操作時將其結果返回給瀏覽器。 – Roman 2010-04-26 00:40:22

+0

好的...現在我明白了。我只是圍繞一個通用動作「包裝」「另一種語言」動作,都「做」相同的事情 這似乎是合乎邏輯的:) – unmircea 2010-04-27 17:59:56

2

我知道我遲到了,但在情況下,有人google搜索,我創建瞭如下匹配多個名稱的屬性(從ActionName屬性的啓發):

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

要使用:

[ActionNames("CreateQuickItem", "CreateFullItem")] 
public ActionResult Create() {} 
相關問題