自定义和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结尾的文件?

自定义和Razor视图引擎结合在一起时很混乱

好的,我已经找到了一个解决方案-从"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;
            }
        }