1

この記事で説明されているように、VirtualPathProvider を使用してデータベースから Razor ビューをロードしています。

問題は、ビューが読み込まれるときに、Razor マークアップが解析されていないことです。これはまさにこのようにページにレンダリングされています"@inherits System.Web.Mvc.WebViewPage hello world

この例では、GetContent()メソッドによって返される文字列をハードコーディングしました。

これが私のコードです:

public class MvcVirtualPathProvider : VirtualPathProvider {
    // virtualPath example >>  "~/Views/View/21EC2020-3AEA-1069-A2DD-08002B30309D.cshtml"
    private static bool IsPathVirtual(string virtualPath)
    {
        string path = VirtualPathUtility.ToAppRelative(virtualPath);

        // returns true if the path is requested by the "ViewController" controller
        if (path.StartsWith("~/Views/TextualReporting/db/", StringComparison.InvariantCultureIgnoreCase))
        {
            return true;
        }
        return false;
    }

    public override bool FileExists(string virtualPath) {
        if (IsPathVirtual(virtualPath)) {
            SimpleVirtualFile file = (SimpleVirtualFile)GetFile(virtualPath);
            if (file.Exists) {
                return true;
            }
            return false;
        }
        return Previous.FileExists(virtualPath);
    }

    public override VirtualFile GetFile(string virtualPath) {
        if (IsPathVirtual(virtualPath)) {
            return new SimpleVirtualFile(virtualPath);
        }
        return Previous.GetFile(virtualPath);
    }

    // Simply return the virtualPath on every request.
    public override string GetFileHash(string virtualPath, System.Collections.IEnumerable virtualPathDependencies) {
        if (IsPathVirtual(virtualPath)) {               
            return virtualPath;
        }
        return base.GetFileHash(virtualPath, virtualPathDependencies);
    }

    private class SimpleVirtualFile : VirtualFile {
        private string content;

        public bool Exists {
            get { return (content != null); }
        }

        public SimpleVirtualFile(string virtualPath)
            : base(virtualPath) {
            GetContent();
        }

        public override Stream Open() {
            ASCIIEncoding encoding = new ASCIIEncoding();
            return new MemoryStream(encoding.GetBytes(this.content), false);
        }

        protected void GetContent() {
            if (IsPathVirtual(VirtualPath)) {                   
                this.content = "@inherits System.Web.Mvc.WebViewPage \r\n hello world";                    
            }
        }
    }

    // just implement the default override and return null if the path is a Virtual Path
    public override CacheDependency GetCacheDependency(string virtualPath,
        System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart) {
        if (IsPathVirtual(virtualPath)) {
            return null;
        }
        return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
    }
}
4

0 に答える 0