C# .NET核心:如何从ViewLocationExpanderContext获取“Controller”实例(或仅获取其全名)
在MVC5中,我拥有自己的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并编
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
。这应该提供必要的细节。检查它是否是其派生类型之一,并查看是否无法从中获取有关控制器的详细信息。我的钱在描述符上,这里有人知道如何获得我可以转换为特定控制器类型的实例吗?而不仅仅是名字。非常感谢。当我看到你的答案时,我正在研究一个不同的解决方案。。现在,我将它们结合到我的最终解决方案中。谢谢你的帮助。