3

関連するスレッドを何十も読み、サンプルから非常に単純な仮想プロバイダーを作成しました。

ただし、仮想ファイル ストリームはレンダリングされません。計画テキストを表示するだけです。

これが出力です。

@inherits System.Web.Mvc.WebViewPage 
@{ViewBag.Title = "Hellow World !";}
<h2>Hellow World !</h2>

これに関する関連スレッドがありますが、どのように解決したか、または解決策が機能しないとは言っていません。何が間違っていたのかわかりません。

他にもたくさんあります...

どうしたの ?

これが私のテストコードです。(Global.asax を変更しただけです。)

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(
            new MyProvider());

        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();
    }
}

public class MyProvider : VirtualPathProvider
{
    public override bool FileExists(string virtualPath)
    {
        if (Previous.FileExists(virtualPath))
            return true;
        else
            //  ~/Infra is the test url
            return virtualPath.StartsWith("/Infra") || virtualPath.StartsWith("~/Infra");
    }

    public override VirtualFile GetFile(string virtualPath)
    {
        if (Previous.FileExists(virtualPath))
            return base.GetFile(virtualPath);
        else
            return new MyVirtualFile(virtualPath);
    }

    public class MyVirtualFile : VirtualFile
    {
        public MyVirtualFile(string virtualPath) : base(virtualPath) { }

        public override Stream Open()
        {
            //Loading stream from seperate dll shows just plain text
            //System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFile(
            //  System.IO.Path.Combine(HttpRuntime.BinDirectory, "Infra.dll"));
            //return assembly.GetManifestResourceStream("Infra.Views.Home.Index.cshtml");

            //Changed to string but also it shows plain text.
            return new System.IO.MemoryStream(System.Text.ASCIIEncoding.UTF8.GetBytes(
                "@inherits System.Web.Mvc.WebViewPage \r\n  <h2>Hellow World !</h2>"));
        }
    }
}
4

1 に答える 1

2

質問が少し古いことがわかりますが、同じエラーが発生しました。問題はテスト URL にあると思います。完全に調査する時間はありませんが、指定された URL が想定された形式 (ASP.NET MVC ビュー エンジンは規則に基づいている) でない限り、ビュー エンジンとして razor を使用していない可能性があると思います。それが原因かどうかはわかりませんが、使用している「インフラ」文字列を使用したいくつかの例:

ホームコントローラーの新しい MVC 4 プロジェクト:

public ActionResult Index()
{
    ViewBag.Message = "Welcome to ASP.NET MVC!";

    dynamic x = new ExpandoObject();

    return View("Infra-test.cshtml", x);
}

これは以下を呼び出します:

private bool IsPathVirtual(string virtualPath)

virtualPath設定し'/Views/Home/Infra-test.cshtml.aspx'ます。最後に aspx 拡張機能が追加されているため、ビューのコンパイルにかみそりを使用していないと思われます。仮想パス プロバイダーを少し変更すると、以下のリンクが機能することがわかります。

public override bool FileExists(string virtualPath)
{
    if (Previous.FileExists(virtualPath))
        return true;
    else
        //  prevent view start compilation errors
        return virtualPath.StartsWith("/Infra") && !virtualPath.Contains("_ViewStart");
}

動作する URL:

return View("/Infra/test.cshtml", x);
return View("/Infra/one/test.cshtml", x);
return View("/Infra/one/two/test.cshtml", x);

これらは機能しません:

return View("/Infra", x);
return View("/Infra/test", x);

サンプルを機能させるには、 も実装する必要がありますGetCacheDependency。そうしないと、ディスク上で仮想パスのファイルが見つからない場合に例外がスローされます。以下に簡単な例を示します。ドキュメントを読んで適切に実装してください。

private bool IsVirtualPath(string virtualPath)
{
    return virtualPath.StartsWith("/Infra") && !virtualPath.Contains("_ViewStart");
}

public override CacheDependency GetCacheDependency(string virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart)
{
    if (IsVirtualPath(virtualPath))
        return null;

    return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
}
于 2013-09-06T16:45:31.107 に答える