gpt4 book ai didi

asp.net - RazorViewEngine.FindView找不到预编译 View

转载 作者:行者123 更新时间:2023-12-02 21:08:30 26 4
gpt4 key购买 nike

App.WebApp.Views 是我在一个解决方案中的项目,我将我的 View 放在 App.Views 中并使用 RazorGenerator 进行预编译。 。如果我使用 App.Web 像这样的话,它会工作得很好,

~/Views/Index.cshtml is virtual path of my view in App.View

它可以在App.Web中成功渲染此 View

public ActionResult Index() {
return View("~/Views/Index.cshtml");
}

但是当我尝试RenderViewToString时,它返回null

class FakeController : ControllerBase
{
protected override void ExecuteCore() { }
public static string RenderViewToString(string controllerName, string viewName, object viewData)
{
using (var writer = new StringWriter())
{
var routeData = new RouteData();
routeData.Values.Add("controller", controllerName);
var fakeControllerContext = new ControllerContext(new HttpContextWrapper(new HttpContext(new HttpRequest(null, "http://google.com", null), new HttpResponse(null))), routeData, new FakeController());
var razorViewEngine = new RazorViewEngine();
var razorViewResult = razorViewEngine.FindView(fakeControllerContext, viewName, "", false);
var viewContext = new ViewContext(fakeControllerContext, razorViewResult.View, new ViewDataDictionary(viewData), new TempDataDictionary(), writer);
razorViewResult.View.Render(viewContext, writer);
return writer.ToString();
}
}
}

这就是怎么可能,

FakeController.RenderViewToString("FakeName", "~/Views/Index.csthml", MessageModel);

enter image description here

This is discussed and probably solved in asp.net core ,但我正在使用 asp.net mvc 5。

您能帮我弄清楚为什么它不起作用吗?

最佳答案

您正在尝试使用 Razor View Engine 来获取预编译 View 。这是个错误。 Razor 引擎根据 cshtml 文件生成 View 。但是,对于预编译 View ,cshtml 文件已被 RazorGenerator 编译为一组派生自 System.Web.Mvc.WebViewPage 的类。这些类重写方法 Execute()(由 RazorGenerator 根据输入 cshtml 自动生成),该方法将 html 写入输出 TextWriter。不再需要原始 View 文件 (cshtml),因此不会随应用程序一起部署。当您调用 Razor 尝试定位 cshtml 并基于它构建 View 时,它预计会返回 null View 。

ASP.NET MVC 支持多个 View 引擎(实现 System.Web.Mvc.IViewEngine 的类)。 RazorViewEngine 就是其中之一。 RazorGenerator.Mvc NuGet 包添加了自己的基于预编译 View 的 View 引擎 (PrecompiledMvc​​Engine)。注册的 View 引擎存储在ViewEngines.Engines集合中。当您安装 RazorGenerator.Mvc NuGet 包时,它会添加 RazorGeneratorMvcStart 类来注册 PrecompiledMvc​​Engine 的实例:

[assembly: WebActivatorEx.PostApplicationStartMethod(typeof(App.Views.RazorGeneratorMvcStart), "Start")]

namespace App.Views {
public static class RazorGeneratorMvcStart {
public static void Start() {
var engine = new PrecompiledMvcEngine(typeof(RazorGeneratorMvcStart).Assembly) {
UsePhysicalViewsIfNewer = HttpContext.Current.Request.IsLocal
};

ViewEngines.Engines.Insert(0, engine);

// StartPage lookups are done by WebPages.
VirtualPathFactoryManager.RegisterVirtualPathFactory(engine);
}
}
}

您应该使用 PrecompiledMvc​​Engine 的此实例而不是 RazorViewEngine 来访问预编译 View 。以下是 RenderViewToString 方法的调整代码:

public static string RenderViewToString(string controllerName, string viewName, object viewData)
{
using (var writer = new StringWriter())
{
var routeData = new RouteData();
routeData.Values.Add("controller", controllerName);
var fakeControllerContext = new ControllerContext(new HttpContextWrapper(new HttpContext(new HttpRequest(null, "http://google.com", null), new HttpResponse(null))), routeData, new FakeController());
var viewEngine = ViewEngines.Engines.OfType<PrecompiledMvcEngine>().FirstOrDefault();
if (viewEngine == null)
{
throw new InvalidOperationException("PrecompiledMvcEngine is not registered");
}
var viewResult = viewEngine.FindView(fakeControllerContext, viewName, "", false);
var viewContext = new ViewContext(fakeControllerContext, viewResult.View, new ViewDataDictionary(viewData), new TempDataDictionary(), writer);
viewResult.View.Render(viewContext, writer);
return writer.ToString();
}
}

一个重要的注意事项:您应该将 RazorGenerator.Mvc NuGet 包安装到包含 View (App.Views) 的项目中,而不是安装到 Web 应用程序项目中,因为 PrecompiledMvc​​Engine 将当前程序集作为预编译 View 的源。另外,请确保 RazorGeneratorMvcStart 未添加到 App.Web 项目中。当我添加对 RazorGenerator.Mvc.dll 程序集的引用时,就发生了这种情况。

Sample Project on GitHub

关于asp.net - RazorViewEngine.FindView找不到预编译 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49399800/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com