2012-02-15 72 views
1

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

一个例子:

网址:example.com/about-us

我想查找在我们的系统,该系统控制器“关于美”是请求使用,然后设置控制器。它不能成为默认的控制器,因为会有许多不同的页面,像上面那样使用不同的控制器。

回答

2

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

另一种方法(如果你真的 INIST做路由逻辑你自己)可能会创建一个“路由选择控制器”有,比方说,它处理所有查询单个动作。通过Inisde这个动作代码,您可以检查参数值,并执行return RedirectToAction(...)将请求重定向到您需要的任何控制器上的任何动作。

UPDATE:示例代码

在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); 
     } 
    } 
} 
+0

我熟悉这样做的正常方式,但我们的客户谁只想域后的URL友好的页面名称。 – 2012-02-15 08:30:21

+0

然后用第二种方式的示例更新我的答案 – 2012-02-15 08:38:39

0

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

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(); 
相关问题