1

MVCフレームワークを使用してCMSを作成しようとしています。すべてが順調に進んでおり、ViewData、ViewTitle、およびvirtualPathを格納するためのテーブルを作成しました。私はVirthPathProviderを使用していますが、次のようになります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Hosting;
using CMS;
using System.Collections.ObjectModel;
using CMS.Components;
using System.Web;

namespace CMS.Providers
{
    public class PageVirtualPathProvider : VirtualPathProvider
    {
        private Directory current { get; set; }
        private Collection<Directory> directories { get; set; }
        private Collection<BasePage> pages { get; set; }

        public override bool FileExists(string virtualPath)
        {
            string Path = (VirtualPathUtility.GetDirectory(virtualPath) != "~/") ? VirtualPathUtility.RemoveTrailingSlash(VirtualPathUtility.GetDirectory(virtualPath)) : VirtualPathUtility.GetDirectory(virtualPath);
            if (IsVirtualPath(Path))
            {
                BasePage oPage = FindPage(virtualPath);
                if (oPage != null) 
                    return true;
            }

            bool bExists = base.FileExists(virtualPath);
            return bExists;
        }

        public override VirtualFile GetFile(string virtualPath)
        {
            string Path = (VirtualPathUtility.GetDirectory(virtualPath) != "~/") ? VirtualPathUtility.RemoveTrailingSlash(VirtualPathUtility.GetDirectory(virtualPath)) : VirtualPathUtility.GetDirectory(virtualPath);
            if (IsVirtualPath(Path))
            {
                BasePage oPage = FindPage(virtualPath);
                if (oPage != null) 
                    return new PageVirtualFile(virtualPath, oPage.ViewData.ToArray());
            }

            return base.GetFile(virtualPath);
        }

        public override bool DirectoryExists(string virtualDir)
        {
            if (IsVirtualPath(virtualDir))
            {
                if (current != null)
                {
                    if (current.Path.ToLower() != virtualDir.ToLower())
                        current = new Directory(virtualDir, "53AF0033-4011-4C8F-A14D-7CE9301E264D");
                }
                else
                {
                    current = new Directory(virtualDir, "53AF0033-4011-4C8F-A14D-7CE9301E264D");
                }
                if (current != null)
                    return true;
            }

            return base.DirectoryExists(virtualDir);
        }

        public override VirtualDirectory GetDirectory(string virtualDir)
        {
            if (IsVirtualPath(virtualDir))
            {
                if (current != null)
                {
                    if (current.Path.ToLower() != virtualDir.ToLower())
                        current = new Directory(virtualDir, "53AF0033-4011-4C8F-A14D-7CE9301E264D");
                }
                else
                {
                    current = new Directory(virtualDir, "53AF0033-4011-4C8F-A14D-7CE9301E264D");
                }
                if (current != null)
                    return new CmsVirtualDirectory(virtualDir, "53AF0033-4011-4C8F-A14D-7CE9301E264D");
            }

            return base.GetDirectory(virtualDir);
        }

        public override System.Web.Caching.CacheDependency GetCacheDependency(string virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart)
        {
            string Path = (VirtualPathUtility.GetDirectory(virtualPath) != "~/") ? VirtualPathUtility.RemoveTrailingSlash(VirtualPathUtility.GetDirectory(virtualPath)) : VirtualPathUtility.GetDirectory(virtualPath);
            if (IsVirtualPath(Path)) 
                return null;

            return base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
        }

        public override string GetFileHash(string virtualPath, System.Collections.IEnumerable virtualPathDependencies)
        {
            string Path = (VirtualPathUtility.GetDirectory(virtualPath) != "~/") ? VirtualPathUtility.RemoveTrailingSlash(VirtualPathUtility.GetDirectory(virtualPath)) : VirtualPathUtility.GetDirectory(virtualPath);
            if (IsVirtualPath(Path))
                return Guid.NewGuid().ToString();

            return base.GetFileHash(virtualPath, virtualPathDependencies);
        }

        private BasePage FindPage(string virtualPath)
        {
            string VirtualName = VirtualPathUtility.GetFileName(virtualPath).ToLower();
            if (pages == null)
            {
                pages = PageManager.getAllPages("53AF0033-4011-4C8F-A14D-7CE9301E264D", false);
            }
            BasePage oPage = pages.SingleOrDefault(page => page.Path.ToLower() == VirtualName);
            return oPage;
        }

        private bool IsVirtualPath(string virtualPath)
        {
            string Path = VirtualPathUtility.ToAppRelative(virtualPath);
            if (directories == null)
            {
                directories = DirectoryManager.GetAllDirectories("53AF0033-4011-4C8F-A14D-7CE9301E264D");
            }
            Directory oDir = directories.SingleOrDefault(dir => dir.Path.ToLower() == Path.ToLower());

            if (oDir == null || virtualPath == "~/") return false; // If we don't have directory, return false
            return true; // Hit only if we are null
        }
    }
}

今私の問題はこれです:ページの取得は問題ありません。仮想の場合、キャッシュとしてnullを返し、FileHashは常に異なる文字列であるため、GetFileが呼び出されます。ファイルは返されますが、レイアウトが見つかりません。

これは、viewsディレクトリがないために_ViewStart.cshtmlがないためだと思います。では、どうすればレイアウトを使用するように強制できますか?仮想ページを@inheritsSystem.Web.Mvc.WebViewPageから継承するなど、さまざまなことを試しましたが、それでも同じ問題が発生します。

仮想ページに移動すると、次のエラーが発生します。タイプ「ASP._Page_Guidelines_index_cshtml」のオブジェクトをタイプ「System.Web.IHttpHandler」にキャストできません。

私を助けてください; 私はこれに3週間立ち往生しています...

4

1 に答える 1