Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET核心:如何从ViewLocationExpanderContext获取“Controller”实例(或仅获取其全名)_C#_Asp.net Core_.net Core_Asp.net Core Mvc - Fatal编程技术网

C# .NET核心:如何从ViewLocationExpanderContext获取“Controller”实例(或仅获取其全名)

C# .NET核心:如何从ViewLocationExpanderContext获取“Controller”实例(或仅获取其全名),c#,asp.net-core,.net-core,asp.net-core-mvc,C#,Asp.net Core,.net Core,Asp.net Core Mvc,在MVC5中,我拥有自己的VirtualPathProviderViewEngine,并拥有以下功能: string controllerAssemblyName = controllerContext.Controller.GetType().Assembly.FullName; var controllerContext = new ControllerContext(context.ActionContext);` 我使用它动态添加视图位置 无论如何,我正在迁移到.NET Core并编

在MVC5中,我拥有自己的
VirtualPathProviderViewEngine
,并拥有以下功能:

string controllerAssemblyName = controllerContext.Controller.GetType().Assembly.FullName;
var controllerContext = new ControllerContext(context.ActionContext);`
我使用它动态添加视图位置

无论如何,我正在迁移到.NET Core并编写自己的
IViewLocationExpander
,需要确定那里的控制器类型才能执行相同的操作。方法签名如下:

public virtual IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)

这给了我一个
ControllerContext
的实例,但与MVC5不同,它没有
Controller
属性。

检查
ActionContext
以访问所需信息

应该能够深入上下文以获取操作控制器类型信息和程序集全名

public virtual IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations) {

    var controllerActionDescriptor = context.ActionContext.ActionDescriptor as ControllerActionDescriptor;
    if(controllerActionDescriptor != null) {
        var controllerTypeInfo = controllerActionDescriptor.ControllerTypeInfo;            
        //From the type info you should be able to get the assembly
        var controllerAssemblyName = controllerTypeInfo.AsType().Assembly.FullName.ToString();
    }

    //...
}
公共虚拟IEnumerable ExpandViewLocations(ViewLocationExpanderContext上下文,IEnumerable viewLocations){
var controllerActionDescriptor=context.ActionContext.ActionDescriptor作为controllerActionDescriptor;
if(controllerActionDescriptor!=null){
var controllerTypeInfo=controllerActionDescriptor.controllerTypeInfo;
//从类型信息中,您应该能够获得程序集
var controllerasemblyname=controllerTypeInfo.AsType().Assembly.FullName.ToString();
}
//...
}

感谢@Nkosi。我使用了他的答案,我的解决方案如下。我不确定
CreateControllerFactory()
部分是否良好,但如果
controllerActionDescriptor
为空,这是我的回退:

string controllerAssemblyName = null;

var controllerActionDescriptor = context.ActionContext.ActionDescriptor as ControllerActionDescriptor;
if (controllerActionDescriptor != null)
{
    var controllerTypeInfo = controllerActionDescriptor.ControllerTypeInfo;
    controllerAssemblyName = controllerTypeInfo.AsType().Assembly.FullName;
}
else
{
    var controllerContext = new ControllerContext(context.ActionContext);
    var factory = CreateControllerFactory();
    var controller = factory.CreateController(controllerContext);
    controllerAssemblyName = controller.GetType().Assembly.FullName;
}


private static DefaultControllerFactory CreateControllerFactory()
{
    var propertyActivators = new IControllerPropertyActivator[]
    {
        new DefaultControllerPropertyActivator(),
    };

    return new DefaultControllerFactory(
        new DefaultControllerActivator(new TypeActivatorCache()), 
        propertyActivators);
}

检查
ActionContext
。这应该提供必要的细节。检查它是否是其派生类型之一,并查看是否无法从中获取有关控制器的详细信息。我的钱在描述符上,这里有人知道如何获得我可以转换为特定控制器类型的实例吗?而不仅仅是名字。非常感谢。当我看到你的答案时,我正在研究一个不同的解决方案。。现在,我将它们结合到我的最终解决方案中。谢谢你的帮助。