如果为空,则将Area Area,Controller和Action名称映射为默认值

时间:2013-01-21 08:49:13

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

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

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

通过做这样的事情可能是可行的

RouteTable.Routes.GetRouteData(context)

但是有没有办法在不构建整个HttpContext对象的情况下完成它?

1 个答案:

答案 0 :(得分:0)

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

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

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

~/Admin

当然,这就提出了一个问题,即你是否已经知道系统中的路由,为什么不能通过查看路由获得默认值。

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