使用短划线和非英文字符进行路由

时间:2013-04-25 07:48:45

标签: asp.net-mvc asp.net-mvc-routing

我有一个特定的路由需求,我无法工作。我在StackOverflow上找到了很多答案,这些答案让我有所收获,但并非一路走来。

我用标准的C#方式命名我的控制器和动作,即每个单词的第一个字母都是大写的:

  

MyController.MyAction()

要实现此操作方法,我希望所有这些网址都能正常工作:

/my-controller/my-action
/my-cöntroller/my-äction
/MyController/MyAction
/MyCöntroller/MyÄction

(最后两个并不是非常重要但是......)

所以这里有两件事:

  1. 可以使用破折号来分隔单词(用于可读性和SEO 目的)。
  2. 可以使用一些非英文字符(所有替代品     指定 - 没有“魔法”)。
  3. 我想用这样的助手创建链接:

    @Html.ActionLink("My link text", "MyController", "MyAction")
    

    即。标准方式,这将创建以下链接:

    /my-controller/my-action
    

    希望这可以在不使我的路由配置过于混乱的情况下完成(例如,对于每个操作或某些事情使用一个路由),或者将属性放在所有操作方法上,但如果这是我想知道的唯一解决方案。

    到目前为止我尝试过的是实现一个重写GetRouteData()和GetVirtualPath()的自定义路由类。它让我更接近,但不是所有的方式,但我可能会做错事

    我有一个想法是通过在执行路由之前进行替换来解决非英文字符的问题,但我还没有找到办法(see this question)。

    如果有人可以帮助我,或者至少指出我正确的方向,我真的很高兴! :)

    编辑:请注意,上面的示例网址只是为了描述我想要的内容。实际上有很多网址必须要处理,所以我更喜欢一些通用的解决方案,而不是一个涉及每个动作的路由或类似的东西。

1 个答案:

答案 0 :(得分:0)

  1. 创建资源文件

    Name            Value
    myaction1   my-äction   
    myaction2   my-action   
    mycontroller1   my-cöntroller   
    mycontroller2   my-controller   
    
  2. 在global.asax

    中的RegisterRoute方法中添加以下路由

    routes.MapRoute(                    名称:“route1”,                    url:Resources.Actions.mycontroller1 +“/”+ Resources.Actions.myaction1,                    默认值:new {controller =“mycontroller1”,action =“myaction1”}                );

            routes.MapRoute(
               name: "route2",
               url: Resources.Actions.mycontroller2 + "/" + Resources.Actions.myaction2,
               defaults: new { controller = "mycontroller2", action = "myaction2" }
           );
    
  3. 在控制器中,

     [HttpGet]
        public ActionResult myaction1()
        {
    
            return View("");
        }
    
    [HttpGet]
    public ActionResult myaction2()
    {
        return View("");
    }
    
  4. 在_Layout.cshtml中

    @ Html.ActionLink(Resources.Actions.myaction1,“myaction1”,“mycontroller1”)    @ Html.ActionLink(Resources.Actions.myaction2,“myaction2”,“mycontroller2”)