【问题标题】:How to control which Action is used in ASP.NET MVC如何控制在 ASP.NET MVC 中使用哪个 Action
【发布时间】:2013-07-02 07:24:46
【问题描述】:

我有一个设置,我使用一个带有以下格式的 url 的路由:

www.example.com/friendly-url-1

www.example.com/friendly-url-2

www.example.com/another-friendly-url

路由是这样定义的:

routes.MapRoute("FriendlyUrl", "{name}",
             new { controller = "FriendlyUrl", action = "Index", name = UrlParameter.Optional }
         );    

Name 是我的应用程序中的一个内部属性,它让我可以在自定义 ControllerFactory 中查找应该使用哪个控制器,并更改创建的控制器的名称(实际上没有名为 FriendlyUrl 的控制器)。

如果我每个控制器只有一个动作,它会很好用,但由于动作不是路由的一部分,它总是使用默认动作。我想拥有多个操作,但我无法找到一种好方法来编写控制每个请求应使用哪个操作的逻辑。有可能吗?

【问题讨论】:

  • 您必须在 URL 中指定要调用的操作。它总是会调用默认操作是有道理的,因为您的路由中没有其他信息可用于调用特定操作。

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


【解决方案1】:

如果我理解正确,您的网址格式为“www.example.com/friendly-url/name”,并希望 name 确定 控制器和操作,例如

  • "example.com/friendly/foo" 将解析为 SomeControllerXxxAction
  • "example.com/friendly/boo" 将解析为 AnotherControllerZzzAction

我认为,最简单的方法是使用自定义路由处理程序

public class MyRouteHander : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        var values = requestContext.RouteData.Values;
        var token = GetRequestToken(requestContext); 
        switch (token) {
           case "friendly/foo") {
            values["controller"] = "some";
            values["action"] = "xxx";
            break;
           case "friendly/boo") {
            values["controller"] = "another";
            values["action"] = "zzz";
            break;
           ...
        }
        return new MvcHandler(requestContext);
    }
}

然后你注册处理程序

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

【讨论】:

    【解决方案2】:

    您可以为您的 URL 编写专用路由,在这种情况下它将调用不同的操作。但是如果您想使用表达式路由到不同的操作,我认为您不能直接通过在 routeConfig 中编写路由来做到这一点,因为您需要在某处指定 URL 段到操作的映射,这相当于在 routeConfig 中创建专用路由

    【讨论】:

    • 只有一个 URL 段:名称。这是我系统中的一个值,使我能够找到正确的控制器和操作。我无法为每个页面(名称)创建单独的路由,因为一个站点可以包含数百万个页面。
    • 在同一侧,每种类型的 url 也会调用相同的操作
    猜你喜欢
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2015-02-17
    • 2014-07-11
    • 1970-01-01
    相关资源
    最近更新 更多