以编程方式将路由映射到控制器

时间:2012-02-15 08:17:55

标签: asp.net-mvc

是否可以通过编程方式将路径映射到控制器?换句话说,我想创建一个没有控制器的路由,并根据url map中其余参数的值为请求提供正确的控制器?

一个例子:

url:example.com/about-us

我想在我们的系统中查找“about-us”使用的控制器,然后为请求设置控制器。它不能是默认控制器,因为会有许多不同的页面,如上所述,使用不同的控制器。

2 个答案:

答案 0 :(得分:1)

你为什么需要这个?处理此类情况的正常MVC方式是为不同的控制器添加不同的路由,指定路由本身内的参数值或使用RouteConstraint s。

另一种方法(如果您真的在自己做路由逻辑时)可能会创建一个“路由控制器”,例如,一个处理所有查询的操作。 Inisde此操作代码可以检查参数值,并执行return RedirectToAction(...)将请求重定向到您需要的任何控制器上的任何操作。

更新:示例代码

在Global.asax.cs中创建以下默认路由:

routes.MapRoute(
    "Default", // Route name
    "{*pathInfo}", // URL with parameters
    new { controller = "Route", action = "Index"} // Parameter defaults
);

还添加一个控制器类RouteController.cs,其中包含以下内容:

// usings here...

namespace YourApp.Controllers
{
    public class RouteController : Controller
    {
        public ActionResult Index(string pathInfo)
        {
            ...
            // programmatically parse pathInfo and determine 
            // controllerName, actionName and routeValues 
            // you want to use to reroute current request
            ...

            return RedirectToAction(actionName, controllerName, routeValues);
        }
    }
}

答案 1 :(得分:1)

我建议使用自定义IRouteHandler实现。您可以使用约束限制路由匹配,然后重写要在IRouteHandler实现中实例化的控制器。 E.g。

    public class RewriteController : IRouteHandler
{

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
                    // here some logic to determine controller name you would like
                    // to instantiate
                    var controllerName = ...;

                    requestContext.RouteData.Values["controller"] = controllerName;
        return new HttpControllerHandler(requestContext.RouteData);
    }
}

然后您的路线可能如下:

        routes.MapHttpRoute
        (
            name: Guid.NewGuid().ToString(),
            routeTemplate: "{controller}/{action}",
                        defaults: new { action = "Index" },
            constraints: new
            {
                controller = "about-us"
            }
        ).RouteHandler = new RewriteController();