代码之家  ›  专栏  ›  技术社区  ›  unom

ASP.NET MVC-同一操作可以有多个名称吗?

  •  8
  • unom  · 技术社区  · 14 年前

    ASP.NET MVC-同一操作可以有多个名称吗?

    在同一个控制器中…我可以为同一个动作取多个名字吗?

    我正在寻找一个完整的多语言解决方案。本质上,我希望所有逻辑都是SA相同的,但是根据语言更改“关键字”(操作、URL中的控制器)。

    3 回复  |  直到 7 年前
        1
  •  8
  •   er-v    14 年前

    同一操作不能有多个名称。这将是不同的行动。这就是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 }
    );
    

    当然,您必须创建许多路由,但您可以创建配置文件或将路由数据存储在数据库中,并在应用程序启动时在循环中创建它们。不管怎样,我认为最好还是创建大量的方法,因为如果你想再添加一种语言,你需要在你的控制器上查找操作并重新编译代码。但在路由和配置文件的情况下,这就不那么难了。 第二件事是html.action link(“home”,“index”,“home”)扩展-您必须实现自己的扩展才能返回本地化的action link。

        2
  •  3
  •   Mark Ball    7 年前

    我知道我迟到了,但如果有人在谷歌搜索,我创建了一个属性(灵感来自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() {}
    
        3
  •  2
  •   Roman    14 年前

    我不确定是否可以有多个操作名。我能想到的一种方法是定义多个名称不同的操作,内部cal/执行相同的操作。