0

我有一个特定的路由需求,我无法开始工作。我在 StackOverflow 上找到了很多答案,这些答案让我有点走神,但不是一路走来。

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

MyController.MyAction()

要达到此操作方法,我希望所有这些 url 都能正常工作:

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

(虽然最后两个不是很重要......)

所以这里有两件事:

  1. 破折号可用于分隔单词(出于可读性和 SEO 目的)。
  2. 可以使用一些非英文字符(指定所有替换 - 没有“魔法”)。

我想用这样的助手创建链接:

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

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

/my-controller/my-action

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

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

我有一个想法,通过在执行路由之前进行替换来解决非英语字符的问题,但我还没有找到一种方法来做到这一点(见这个问题)。

如果有人可以帮助我,或者至少为我指明正确的方向,我将非常感激!:)

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

4

1 回答 1

0
  1. 创建你的资源文件

    Name            Value
    myaction1   my-äction   
    myaction2   my-action   
    mycontroller1   my-cöntroller   
    mycontroller2   my-controller   
    
  2. 在 global.asax 的 RegisterRoute 方法中添加以下路由

    routes.MapRoute(name: "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")

于 2013-04-25T09:28:53.817 回答