我正在研究什么应该是一个小的RazorViewEngine扩展,但在我的方法的第二部分有一些困难。
基本上我有一些专用于某些部分视图的控制器,并希望能够将它们放在子目录中。当然,将模型和控制器放在子目录中很容易,但视图也需要匹配。这就是它变得棘手的地方。
下面你会看到我的引擎,我缺少的是如何获取主控制器的名称。似乎我应该能够以某种方式扩展ControllerContext
?
在FileExists
覆盖中,您可以看到我在一个值中进行了硬编码以进行测试,这样做很有效。但我不只是想要管理。控制器关系的一个例子 - 我有一个管理控制器,它加载一些部分,每个部分都有自己的专用控制器,例如User。因此,当我为用户加载视图时,我希望它转到Views/Administration/User
而不是Views/User
。
public class PartialsViewEngine : RazorViewEngine
{
private static string[] NewPartialViewFormats = new[] {
"~/Views/%1/{1}/{0}.cshtml",
"~/Views/{1}/Partials/{0}.cshtml",
"~/Views/Shared/Partials/{0}.cshtml"
};
public PartialsViewEngine()
{
base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray();
}
protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
{
string firstController = '????. //Trying to figure how to get this
var path = partialPath.Replace("%1", firstcontroller);
return base.CreatePartialView(controllerContext, path));
}
protected override bool FileExists(ControllerContext controllerContext, string virtualPath)
{
var path = partialPath.Replace("%1", "Administration");
return base.FileExists(controllerContext, path);
}
}
如果控制器的开销最小,我将如何获得该值?
--- 更新1 ---
我注意到,使用此配置时,resharper即使执行也无法识别文件路径。