Asp.net mvc ASP.NET MVC-可以为同一个操作指定多个名称吗?
ASP.NET MVC-可以为同一个操作指定多个名称吗 在同一控制器中。。。同一个动作可以有多个名称吗Asp.net mvc ASP.NET MVC-可以为同一个操作指定多个名称吗?,asp.net-mvc,Asp.net Mvc,ASP.NET MVC-可以为同一个操作指定多个名称吗 在同一控制器中。。。同一个动作可以有多个名称吗 我正在寻找一个完整的多语言解决方案。基本上,我希望所有逻辑都是相同的,但根据语言更改“关键字”(url中的操作、控制器)。我不确定是否可以有多个操作名称。我可以考虑这样做的一种方法是使用不同的名称定义多个操作,以便内部调用/执行同一操作。同一操作不能有多个名称。这将是不同的行动。这就是mvc的工作方式。也许最好通过路由实现所描述的行为 routes.MapRoute("Lang1RouteTo
我正在寻找一个完整的多语言解决方案。基本上,我希望所有逻辑都是相同的,但根据语言更改“关键字”(url中的操作、控制器)。我不确定是否可以有多个操作名称。我可以考虑这样做的一种方法是使用不同的名称定义多个操作,以便内部调用/执行同一操作。同一操作不能有多个名称。这将是不同的行动。这就是mvc的工作方式。也许最好通过路由实现所描述的行为
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 }
);
当然,您必须创建许多路由,但您可以创建配置文件或在数据库中存储路由数据,并在应用程序启动时在循环中创建它们。无论如何,我认为这比创建大量的方法要好,因为如果你想再添加一种语言,你需要在你的控制器上找到所有的动作并重新编译代码。但在路由和配置文件的情况下,这就不那么难了。
第二件事是Html.ActionLink(“Home”、“Index”、“Home”)扩展-您必须实现自己的扩展才能返回本地化的action link。我知道我来晚了,但如果有人在谷歌搜索,我创建了一个属性(灵感来自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));
}
}
不能改为设置Thread.CurrentThread.CurrentCulture、Thread.CurrentThread.CurrentUICulture吗?很好的解决方法!但是生成的“最终”url将具有每个其他操作调用的“主要”操作的名称。我不这么认为。我并不是建议重新采取行动。您只需执行另一个操作(即控制器类中的另一个公共方法),并在执行操作时将其结果返回到浏览器。。。现在我明白了。我只是把“另一种语言”的动作“包装”在一个泛型动作周围,两者“做”同样的事情这似乎是合乎逻辑的:)在我发布之后,我也有这个想法。你认为我可以用不同的动作名称调用同一个类来做一些事情,并将这些类(动作逻辑)放在不同的文件中吗?是的,你可以。但正如我已经说过的,当你决定添加新的语言时,这会带来很多痛苦。此外,在代码中看到用不同语言命名的方法并执行相同的操作看起来会很奇怪。我真的认为路由在您的情况下会更合适,因为它使用字符串。每一个tyme我们都本地化一些东西-我们本地化字符串-而不是方法的名称。但这只是我的意见:)对网核有什么建议吗?
[ActionNames("CreateQuickItem", "CreateFullItem")]
public ActionResult Create() {}