【问题标题】:How to rewrite URL in MVC 3?如何在 MVC 3 中重写 URL?
【发布时间】:2012-08-06 08:14:01
【问题描述】:

我正在使用 MVC 3。众所周知,MVC 根据控制器中操作方法的名称设置 URL,但我需要稍作修改。

出于安全目的,我不想在 URL 中显示我的操作方法的名称。因此,如果我在 Home 控制器中有 index 方法,URL 将是这样的:www.server/home/index 但我想在浏览器中显示www.server/home/test。我可以通过使用[ActionName] 属性来做到这一点,但是还有其他方法吗?

我可以为此使用自定义路由处理程序吗?

【问题讨论】:

  • 隐藏方法名的安全目的是什么?
  • 取决于您的需求。那将“测试”指的是?每个控制器是否有多个操作?您可以使用路由来实现这一点,但如果名称特定于每个动作(和自定义),那么您将不得不为每个动作添加一个路由,这对我来说似乎毫无意义(在这种情况下 [ActionName] 听起来更可行的选项) .如果“测试”是您可以检索或有办法找出的特定内容,那么路由或扩展控制器可能是一个解决方案。让我知道你的目标是什么,我会帮助你:)
  • 现在我只需要为一种操作方法执行此操作,但要使用自定义路由处理程序。 @Pluc
  • 说实话我不太确定,但是我的老师告诉我,有时需要隐藏特定的方法名,因为如果有黑客知道方法名,那么我相信这会很容易破解代码,因为他知道有一种特殊的方法可以从中获得一些有价值的信息。 @AlexC

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


【解决方案1】:

作为使用ActionName 的替代方案,您可以定义自定义路由并将其定向到您想要的任何控制器和操作。例如:

routes.MapRoute("home/test", "home/test/{id}",
  new { controller = "Home", action = "Index", id = UrlParameter.Optional });

将采用 /home/test/home/test/42 之类的路径并将它们路由到 Home 控制器的 Index 操作。

如果您不需要,也可以省略 {id} 部分。例如:

routes.MapRoute("home/test", "home/test",
  new { controller = "Home", action = "Index" });

只接受/home/test

这也是我在保持大写控制器和动作名称的同时实现小写 URL 的方式。我只是硬编码我所有的路线。

【讨论】:

  • 这适用于小型站点,但这不会成为维护的噩梦吗?
  • 我会检查这个并将它展示给我的老师。如果他同意,那么我会告诉你,或者如果他提出其他建议,我也会分享。感谢您的关注。
  • @AlexC 可能,但不一定。这取决于您的站点中有多少控制器和操作以及它们更改的频率。更改路由实际上比重命名控制器或操作更容易。
猜你喜欢
  • 2011-12-23
  • 2011-12-22
  • 2014-09-26
  • 2015-07-15
  • 2012-07-14
  • 2012-07-03
  • 1970-01-01
  • 2011-04-23
  • 2016-03-28
相关资源
最近更新 更多