是的,应该可以做到这一点。我可以想到一种方法;可能还有其他人。
第一步是修改默认路由以包含您的应用程序名称:
routes.MapRoute("Default",
"{applicationName}/{controller}/{action}/{id})",
null, null);
我假设您要将两个“应用程序”分组到单个程序集中的不同名称空间中。因此,您可能有两个命名空间,例如:
- MyApp.Blog.Controllers
- MyApp.Forum.Controllers
接下来,您需要更改控制器工厂,以便实例化正确的控制器。您可以通过子类型化 DefaultControllerFactory 并覆盖 GetControllerType 方法来做到这一点:
protected override System.Type GetControllerType(string controllerName)
{
string applicationName;
if (RequestContext != null &&
RequestContext.RouteData.Values.TryGetValue(
"applicationName", out applicationName)) {
// return controller type using app name to
// look up namespace and controllerName argument
return ...
}
// if no match, maybe it's a different controller/route
return base.GetControllerType(controllerName);
}
最后,您需要告诉 MVC 使用您的 ControllerFactory。在 Global.asax.cs 中:
private void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(
MyApp.MyControllerFactory());
}
可以类似地处理定位视图。在这种情况下,您将子类型化为 WebFormViewEngine。