是否可以通过编程方式将路径映射到控制器?换句话说,我想创建一个没有控制器的路由,并根据url map中其余参数的值为请求提供正确的控制器?
一个例子:
url:example.com/about-us
我想在我们的系统中查找“about-us”使用的控制器,然后为请求设置控制器。它不能是默认控制器,因为会有许多不同的页面,如上所述,使用不同的控制器。
答案 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();