自定义和剃刀视图引擎混乱,同时结合两者

时间:2014-05-15 14:30:08

标签: c# asp.net-mvc razor viewengine webforms-view-engine

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

现在,我的问题在于旧的剃刀页面,它们由于某种原因(而不是使用剃刀视图引擎)使用此引擎进行渲染,并且在“查找视图”时会出现异常。功能运行。

我以特殊的方式渲染我的剃刀页面,但最重要的是,它看起来像这样:

public ActionResult MyAction()
{
   return View('Razor/abcd.cshtml',model);
}

我已经读过网络表单引擎首先运行,只有在剃刀运行之后才会运行,但我不确定这是否正确。
我已尝试从自定义引擎返回null和其他内容,但该页面无法呈现。

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

1 个答案:

答案 0 :(得分: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;
            }
        }