是否有可能以编程方式将路线映射到控制器?换句话说,我想创建一个没有控制器的路由,并根据url中其余参数的值将正确的控制器映射到请求中?以编程方式将路线映射到控制器
一个例子:
网址:example.com/about-us
我想查找在我们的系统,该系统控制器“关于美”是请求使用,然后设置控制器。它不能成为默认的控制器,因为会有许多不同的页面,像上面那样使用不同的控制器。
是否有可能以编程方式将路线映射到控制器?换句话说,我想创建一个没有控制器的路由,并根据url中其余参数的值将正确的控制器映射到请求中?以编程方式将路线映射到控制器
一个例子:
网址:example.com/about-us
我想查找在我们的系统,该系统控制器“关于美”是请求使用,然后设置控制器。它不能成为默认的控制器,因为会有许多不同的页面,像上面那样使用不同的控制器。
为什么你需要这个?处理这种情况的正常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);
}
}
}
我会建议使用自定义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();
我熟悉这样做的正常方式,但我们的客户谁只想域后的URL友好的页面名称。 – 2012-02-15 08:30:21
然后用第二种方式的示例更新我的答案 – 2012-02-15 08:38:39