0

かみそりのページもレンダリングするasp.net Web APIアプリケーションがあります。
デフォルトでは、2 つのデフォルト エンジン (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

さて、私の問題は古いかみそりのページにあります.何らかの理由で(かみそりビューエンジンではなく)このエンジンでレンダリングされ、「FindView」機能の実行中に例外が発生します.

かみそりのページを特別な方法でレンダリングしましたが、最終的には次のようになります。

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

Web フォーム エンジンが最初に実行され、その後かみそりエンジンが実行されると読んだことがありますが、それが正しいかどうかはわかりません。
カスタム エンジンから null などを返そうとしましたが、ページがレンダリングされません。

.cshtml パスがカミソリ エンジンではなくカスタム エンジンでレンダリングされるのはなぜですか?
.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 に答える