0

我有一个 asp.net web api 应用程序,它也呈现一些剃须刀页面。
默认情况下,有两个默认引擎(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);
}

我读过网络表单引擎首先运行,然后才运行剃须刀引擎,但我不确定这是正确的。
我尝试从自定义引擎返回 null 和其他内容,但页面没有被渲染。

为什么我的 .cshtml 路径使用自定义引擎而不是 razor 引擎呈现?
如何告诉自定义引擎传递以 .cshtml 结尾的文件?

4

1 回答 1

0

好的,我找到了一种解决方法 - 从“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;
            }
        }
于 2014-05-15T14:44:22.363 回答