【问题标题】:Map Area, Controller and Action names to default values if empty如果为空,则将区域、控制器和操作名称映射为默认值
【发布时间】:2013-01-21 08:49:12
【问题描述】:

我得到了 3 个字符串:areacontrolleraction。其中一些可能有空值,因为在我的路线中定义了默认值。例如,如果action 为空,它将被映射到Index

我希望通过我的应用程序的路由传递这 3 个字符串,并在映射到默认值的任何空值之后获取它们的实际值。这可能吗?

也许这样做是可行的

RouteTable.Routes.GetRouteData(context)

但是有没有办法在不构造整个 HttpContext 对象的情况下做到这一点?

【问题讨论】:

  • Panos,我试图在下面回答您的问题。如果您能提供更多关于您为什么要尝试做这样的事情以及为什么需要这样做的背景信息,那将会很有帮助。

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


【解决方案1】:

您要做的第一件事是获取三个字符串并将其转换为可以通过路由系统传递的 URL。您如何执行此操作取决于您创建了哪些路线。假设您的路由表中有典型的默认路由:

        context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { controller="Home", action = "Index", id = UrlParameter.Optional }
        );

然后您必须使用 URL 模式“{area}/{controller}/{action}/{id}”来构建您的 URL。在您的情况下,某些字符串可能为空,因此您的 URL 不会包含所有段。例如,如果 Area="Admin" 且 Controller 和 Action 为空,则基于此路由的 URL 将是:

~/Admin

当然,这提出了一个问题,如果您已经知道系统中的路由,为什么不能通过查看路由来获取默认值。

一旦您有了要测试的 URL,您将需要创建一个 HttpContentBase 对象的模拟,然后通过 RouteTable.Routes.GetDate(httpContext) 运行它。有简单的样板代码可以做到这一点,因为你真的不需要模拟很多组成的 HttpRequestBase 或 HttpResponseBase 类。例如,有关使用 Moq 模拟框架模拟 HttpContextBase 对象的示例,请参阅 here

【讨论】:

    猜你喜欢
    • 2013-08-30
    • 1970-01-01
    • 2011-09-22
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多