直接上代码,主要看红色文字,在这里根据自己项目需求获取到控制器的type。
public class CustomControllerFactory : DefaultControllerFactory
{
/// <summary>
/// 根据控制器名称及请求信息获得控制器类型。
/// </summary>
/// <param name="requestContext">请求信息</param>
/// <param name="controllerName">控制器名称。</param>
/// <returns>控制器类型。</returns>
protected override Type GetControllerType(RequestContext requestContext, string controllerName)
{
Type controllerType = null;
//路由中包含pluginName才重写, 反射动态加载的控制器必须重写控制器工厂。
if (requestContext.RouteData.Values.ContainsKey("pluginName"))
{
string pluginName = requestContext.RouteData.Values["pluginName"].ToString();
controllerType = this.GetControllerType(pluginName, controllerName);
}
else
{
controllerType = base.GetControllerType(requestContext, controllerName);
if (controllerType != null)
{
if (requestContext.RouteData.DataTokens.ContainsKey("Namespaces"))
{
string[] nameSpaces = (string[])requestContext.RouteData.DataTokens["Namespaces"];
//把默认优先级改为直接限制
if (!nameSpaces.Contains(controllerType.Namespace))
{
return null;
}
}
}
}
return controllerType;
}
.....
重写必须继承DefaultControllerFactory,然后在启动时候注册,注册方式,可以在global文件的Application_Start()中注册,代码如下:
ControllerBuilder.Current.SetControllerFactory(new CustomControllerFactory()); //重新注册控制器工厂
也可以通过特性自启动,代码如下:
[assembly: System.Web.PreApplicationStartMethod(typeof(PageAdmin.Plugin.Bootstrapper), "Initialize")] namespace PageAdmin.Plugin { /// <summary> /// 引导程序。 /// </summary> public static class Bootstrapper { /// <summary> /// 初始化。 /// </summary> public static void Initialize() { //注册插件控制器工厂。 ControllerBuilder.Current.SetControllerFactory(new PluginControllerFactory());
............... } } }