0

我正在做一些自定义基础设施来为单个视图自动生成特定的包,并且有一个案例我需要获取每个视图的布局值,同时将它们作为文件进行迭代。

我已经尝试过var view = new RazorView(new ControllerContext(), actionView.FullName, null, true, null);,但这将 LayoutPath 作为输入,如果我为该参数提供 null ,它确实会在 RazorView的LayoutPath属性上产生一个空字符串,因此它不会解析文件的值。

有没有其他方法可以以类似的方式解决这个问题,或者我最好/唯一的选择是只解析原始文件的文本(和_ViewStart)?

这仅在应用程序启动时完成一次,因此性能目前不是问题。

4

1 回答 1

0

好吧,经过大量源代码调试和与内部访问修饰符的史诗般的战斗,我有了一个工作解决方案,而无需渲染整个页面。我不希望其他人有这个需要,但无论如何:

var httpContext = new HttpContextWrapper(new HttpContext(new HttpRequest("", "http://dummyurl", ""), new HttpResponse(new StreamWriter(new MemoryStream()))));
var page = Activator.CreateInstance(BuildManager.GetCompiledType(ReverseMapPath(actionView.FullName))) as WebViewPage;

page.Context = httpContext;
page.PushContext(new WebPageContext(), new StreamWriter(new MemoryStream()));
page.Execute();

var layoutFileFullName = page.Layout;

// If page does not have a Layout defined, search for _ViewStart
if (string.IsNullOrEmpty(layoutFileFullName))
{
    page.VirtualPath = ReverseMapPath(actionView.FullName);
    var startpage = StartPage.GetStartPage(page, "_ViewStart", new string[] {"cshtml"});
    startpage.Execute();
    layoutFileFullName = startpage.Layout;
}

多田!

附言。ReverseMapPath是一个任意函数,用于解析完整文件名的相对路径,例如从物理路径获取相对虚拟路径

于 2014-06-25T13:15:25.317 回答