我有一个特定的路由需求,我无法工作。我在StackOverflow上找到了很多答案,这些答案让我有所收获,但并非一路走来。
我用标准的C#方式命名我的控制器和动作,即每个单词的第一个字母都是大写的:
MyController.MyAction()
要实现此操作方法,我希望所有这些网址都能正常工作:
/my-controller/my-action
/my-cöntroller/my-äction
/MyController/MyAction
/MyCöntroller/MyÄction
(最后两个并不是非常重要但是......)
所以这里有两件事:
我想用这样的助手创建链接:
@Html.ActionLink("My link text", "MyController", "MyAction")
即。标准方式,这将创建以下链接:
/my-controller/my-action
希望这可以在不使我的路由配置过于混乱的情况下完成(例如,对于每个操作或某些事情使用一个路由),或者将属性放在所有操作方法上,但如果这是我想知道的唯一解决方案。
到目前为止我尝试过的是实现一个重写GetRouteData()和GetVirtualPath()的自定义路由类。它让我更接近,但不是所有的方式,但我可能会做错事
我有一个想法是通过在执行路由之前进行替换来解决非英文字符的问题,但我还没有找到办法(see this question)。
如果有人可以帮助我,或者至少指出我正确的方向,我真的很高兴! :)编辑:请注意,上面的示例网址只是为了描述我想要的内容。实际上有很多网址必须要处理,所以我更喜欢一些通用的解决方案,而不是一个涉及每个动作的路由或类似的东西。
答案 0 :(得分:0)
创建资源文件
Name Value
myaction1 my-äction
myaction2 my-action
mycontroller1 my-cöntroller
mycontroller2 my-controller
在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" }
);
在控制器中,
[HttpGet]
public ActionResult myaction1()
{
return View("");
}
[HttpGet]
public ActionResult myaction2()
{
return View("");
}
在_Layout.cshtml中
@ Html.ActionLink(Resources.Actions.myaction1,“myaction1”,“mycontroller1”) @ Html.ActionLink(Resources.Actions.myaction2,“myaction2”,“mycontroller2”)