首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC: VirtualPathProvider

MVC: VirtualPathProvider
EN

Stack Overflow用户
提问于 2014-09-04 12:35:48
回答 1查看 668关注 0票数 0

我已经在这里搜索过了,但是我没有找到解决方案,所以我们希望你们中的一些人能给我一些指导。

我希望MVC从数据库中加载视图,因此我创建了一个VirtualFile和一个VirtualPathProvider。

这是来自VirtualFile的代码:

代码语言:javascript
复制
public class OxygenVirtualFile : VirtualFile
{
    #region Constructors

    /// <summary>
    ///     Create a new instance of the <see cref="OxygenVirtualFile"/>.
    /// </summary>
    /// <param name="virtualPath">The virtual path to the resource represented by this instance.</param>
    /// <param name="body">The contents of the virtual file.</param>
    public OxygenVirtualFile(string virtualPath, string body)
        : base(virtualPath)
    {
        content = body;
    }

    #endregion

    #region Properties

    /// <summary>
    ///     Gets the contents of the virtual file.
    /// </summary>
    private readonly string content;

    /// <summary>
    ///     A boolean that indicates wether this virtual file does exists.
    /// </summary>
    public bool Exists
    {
        get { return (content != null); }
    }

    #endregion

    #region VirtualFile Members

    /// <summary>
    ///     returns a read-only stream to the virtual resource.
    /// </summary>
    /// <returns>A read-only stream to the virtual resource.</returns>
    public override Stream Open()
    {
        var encoding = new ASCIIEncoding();
        return new MemoryStream(encoding.GetBytes(content), false);
    }

    #endregion
}

那么我就有了提供者本身:

代码语言:javascript
复制
public class OxygenVirtualPathProvider : VirtualPathProvider
{
    #region Constructors

    /// <summary>
    ///     Create a new instance of the <see cref="OxygenVirtualPathProvider"/>.
    /// </summary>
    /// <param name="exludedPath">The path that should be excluded and thus not be rendered using this virtual path provider.</param>
    /// <remarks>
    ///     If the specified path does occur somewhere in the url, the view is not rendered using this <see cref="VirtualPathProvider"/>.
    ///     In all the other cases, the view is rendered using this <see cref="VirtualPathProvider"/>.
    /// </remarks>
    public OxygenVirtualPathProvider(string exludedPath)
    {
        var unityContainer = DependencyResolver.Current.GetService<IUnityContainer>();

        unitOfWork = unityContainer.Resolve<IUnitOfWork>();

        this.exludedPath = exludedPath;
    }

    #endregion

    #region Properties

    /// <summary>
    ///     Gets the <see cref="IUnitOfWork"/> which is used to access the database.
    /// </summary>
    private readonly IUnitOfWork unitOfWork;

    /// <summary>
    ///     Get the root path of the dynamic views.
    /// </summary>
    private readonly string exludedPath;

    #endregion

    #region Methods

    /// <summary>
    ///     Check if the view is dynamic view.
    /// </summary>
    /// <param name="virtualPath">The path of the virtual view.</param>
    /// <returns>True is the view is a dynamic view, false otherwise.</returns>
    public bool IsDynamicView(string virtualPath)
    {
        // If the path which is requested does contain an excluded url, this virtual path provider will not handle this.
        if (virtualPath.ToLower().Contains(exludedPath))
        { return false; }

        var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(virtualPath);
        var viewExists = DoesViewExistInDataBase(fileNameWithoutExtension);

        return viewExists && !virtualPath.ToLower().Contains(exludedPath);
    }

    /// <summary>
    ///     Verify that the requested view exists in the database.
    /// </summary>
    /// <param name="virtualPath">The path of the virtual view.</param>
    /// <returns>True if the view exists in the database, false otherwise.</returns>
    public bool DoesViewExistInDataBase(string virtualPath)
    {
        var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(virtualPath);

        return new ViewManager(unitOfWork).Exists(fileNameWithoutExtension);
    }

    /// <summary>
    ///     Gets the view from the database.
    /// </summary>
    /// <param name="virtualPath">The virtual path of the view to retrieve.</param>
    /// <returns>A string representing the body of the view.</returns>
    public String GetViewBodyFromDb(string virtualPath)
    {
        var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(virtualPath);

        return new ViewManager(unitOfWork).Get(fileNameWithoutExtension);
    }

    #endregion

    #region VirtualPathProvider Members

    /// <summary>
    ///     Gets a value that indicates whether a file exists in the virtual file system.
    /// </summary>
    /// <param name="virtualPath">The path to the virtual file.</param>
    /// <returns>true if the file exists in the virtual file system; otherwise, false.</returns>
    public override bool FileExists(string virtualPath)
    {
        return IsDynamicView(virtualPath) || base.FileExists(virtualPath);
    }

    /// <summary>
    ///     Gets a virtual file from the virtual file system.
    /// </summary>
    /// <param name="virtualPath">The path to the virtual file.</param>
    /// <returns>A descendent of the <see cref="VirtualFile"/> class that represents a file in the virtual file system.</returns>
    public override VirtualFile GetFile(string virtualPath)
    {
        return IsDynamicView(virtualPath) ? new OxygenVirtualFile(virtualPath, GetViewBodyFromDb(virtualPath)) : base.GetFile(virtualPath);
    }

    /// <summary>
    ///     Returns a hash of the specified virtual paths.
    /// </summary>
    /// <param name="virtualPath">The path to the primary virtual resource.</param>
    /// <param name="virtualPathDependencies">An array of paths to other virtual resources required by the primary virtual resource.</param>
    /// <returns>A hash of the specified virtual paths.</returns>
    public override string GetFileHash(string virtualPath, System.Collections.IEnumerable virtualPathDependencies)
    {
        return base.GetFileHash(virtualPath, virtualPathDependencies);
    }

    /// <summary>
    ///     Creates a cache dependency based on the specified virtual paths.
    /// </summary>
    /// <param name="virtualPath">The path to the primary virtual resource.</param>
    /// <param name="virtualPathDependencies">An array of paths to other resources required by the primary virtual resource.</param>
    /// <param name="utcStart">The UTC time at which the virtual resources were read.</param>
    /// <returns>A <see cref="CacheDependency"/> object for the specified virtual resources.</returns>
    public override CacheDependency GetCacheDependency(string virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart)
    {
        return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
    }

    #endregion
}

为了确保我的视图继承正确,我确实返回了以下内容:

代码语言:javascript
复制
 public string Get(string name)
 {
     return "@inherits System.Web.Mvc.WebViewPage<dynamic>" +
            " <h2>title</h2>";
 }

根据我和我在这里所发现的,这应该是可行的,但是下面的错误被抛出了:

代码语言:javascript
复制
The view at '~/Views/Home/articles.aspx' must derive from ViewPage, ViewPage<TModel>, ViewUserControl, or ViewUserControl<TModel>.

编辑:

提供程序也在global.asax文件中注册:

代码语言:javascript
复制
protected void Application_Start()
{
    HostingEnvironment.RegisterVirtualPathProvider(new OxygenVirtualPathProvider("/CMS/"));

    AreaRegistration.RegisterAllAreas();
    RouteConfig.RegisterRoutes(RouteTable.Routes);
}

有人知道这事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-04 12:45:30

好的,

我已经找到了解决办法。Mvc用于搜索ASPX、ASCX、CSHTML等文件。

当我将VirtualPathProvider更改为仅在搜索的文件以.CSHTML结束时加载动态文件时,错误就消失了。

它现在起作用了,但我想知道为什么我一开始就有这种行为。有谁能给我一个答案吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25665712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档