自定义和Razor视图引擎结合在一起时很混乱
本文关键字:在一起 混乱 结合 引擎 Razor 视图 自定义 | 更新日期: 2023-09-27 18:03:37
我有一个asp.net web api应用程序,它也可以呈现一些razor页面。
默认情况下,有两个默认引擎(webform'razor),我渲染我的razor页面没有任何问题。
现在我需要支持一些使用自定义引擎渲染的旧aspx'ascx页面。
当我引导我的应用程序时,我这样做:
// Remove the default web form engine
ViewEngines.Engines.Remove(ViewEngines.Engines.OfType<WebFormViewEngine>().FirstOrDefault());
// Add my custom engine
ViewEngines.Engines.Add(ApplicationContainer.Resolve<CustomViewEngine>());
我的自定义视图引擎的原型是:
public class CustomViewEngine: VirtualPathProviderViewEngine
现在,我的问题是旧的剃刀页面,他们被渲染这个引擎出于某种原因(而不是剃刀视图引擎),我得到一个异常,而'FindView'功能运行。
我用一种特殊的方式渲染了我的剃刀页面,但底线是,它看起来像这样:
public ActionResult MyAction()
{
return View('Razor/abcd.cshtml',model);
}
我读到web表单引擎首先运行,之后才运行剃刀,但我不确定这是正确的。
我试过从自定义引擎返回null和其他东西,但是页面没有被渲染。
为什么我的。cshtml路径得到渲染自定义引擎,而不是剃刀引擎?
我如何告诉自定义引擎传递以。cshtml结尾的文件?
好的,我已经找到了一个解决方案-从"FileExists"函数返回false将转到下一个文件引擎:
protected override bool FileExists(ControllerContext controllerContext, string virtualPath)
{
try
{
return !virtualPath.EndsWith("cshtml") &&
File.Exists(controllerContext.HttpContext.Server.MapPath(virtualPath));
}
catch (HttpException exception)
{
if (exception.GetHttpCode() != 0x194)
{
throw;
}
return false;
}
catch
{
return false;
}
}