2013-04-25 75 views
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()的自定义路由类。它让我更接近但并不是所有的方式,但我可能会做错的事

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

如果有人能够帮助我,或者至少指出我的方向正确,我会非常感激! :)

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

回答

0
  1. 创建资源文件

    Name   Value 
    myaction1 my-äction 
    myaction2 my-action 
    mycontroller1 my-cöntroller 
    mycontroller2 my-controller 
    
  2. 添加以下Global.asax中

    routes.MapRoute( 名RegisterRoute方法路线: “路径1”, 网址: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”)

+0

Thanks for the答案asb,但这不适合我。我会有很多网址,并且有/无非英文字符等的组合会迫使我使用此解决方案获得大量路线。另外,每次添加新操作时,我都必须添加新路线。我已更新我的描述以澄清此问题。 – haagel 2013-04-26 09:25:37