asp.net-mvc-3 - 从自定义 VirtualPathProvider(ASHX 源)加载 Razor View 时出现奇怪的行为

标签 asp.net-mvc-3 razor virtualpathprovider viewbag cache-dependency

当我通过自定义 VirtualPathProvider 加载数据时,出现一些奇怪的行为。 值得一提的是,我正在尝试使用此 View 作为布局。

public class MyVirtualPathProvider : VirtualPathProvider
{
    public MyVirtualPathProvider()
        : base()
    {

    }

    public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) 
    {
        if ((virtualPath.StartsWith("/Path/") ||
            virtualPath.StartsWith("~/Path/")) && virtualPath.EndsWith(".cshtml"))
        {
            String name = virtualPath.Replace("/Path/", "").Replace(".cshtml", "");
            Uri uri = new Uri("http://www.example.com/Handler.ashx?path=" + name);
            return new WebCacheDependency(uri.ToString());
        }

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

    public override bool FileExists(string virtualPath)
    {
        if ((virtualPath.StartsWith("/Path/") || 
            virtualPath.StartsWith("~/Path/")) && virtualPath.EndsWith(".cshtml"))
            return true;

        return base.FileExists(virtualPath);
    }

    public override VirtualFile GetFile(string virtualPath)
    {
        if (virtualPath.StartsWith("/Path/") || virtualPath.StartsWith("~/Path/"))
            return new TemplateVirtualFile(virtualPath);

        return base.GetFile(virtualPath);
    }
}

我还实现了一个自定义(虚拟)CacheDependency

public class WebCacheDependency : CacheDependency
{
    public WebCacheDependency(String url)
    {
        this.SetUtcLastModified(DateTime.UtcNow);
    }
}

现在有两件事不起作用。首先,所有加载的 View 都被缓存,其次,文件内的代码(@Html.ActionLink ...等)不起作用,它只是给出错误“程序集丢失”。

有人知道如何解决这两个问题吗?

第二个问题( link )已经有了解决方案,但是我真的不明白如何在 FileExists 方法中解决这个问题。

谢谢!

更新:错误消息的图像 enter image description here

最佳答案

您的 web.config 是否已为 Razor 正确设置?如果您不指定 WebViewPagepageBaseType,您将无法访问 ViewBag,因为它不是默认的基本类型,WebPageBase.

您的 web.config 应如下所示:

<system.web.webPages.razor>
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    [...]
  </pages>
</system.web.webPages.razor>

请注意pageBaseType 属性。更多信息请点击:http://msdn.microsoft.com/en-us/library/system.web.webpages.razor.configuration.razorpagessection.pagebasetype(v=vs.99).aspx

By default, the default value for PageBaseType is System.Web.WebPages.WebPage.

关于asp.net-mvc-3 - 从自定义 VirtualPathProvider(ASHX 源)加载 Razor View 时出现奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6719338/

相关文章:

asp.net-mvc-3 - asp.mvc单元测试viewresult问题

visual-studio - &lt;script&gt; 中的 Razor @if 被 VS11 拒绝

asp.net - 使用预编译的 Razor View 和 VirtualPathProviders 时找不到文件 PrecompiledApp.config

c# - 在 Razor View 中遍历列表

asp.net - Web部署项目: Publish without Precompilation

dotnetnuke - 是否可以将虚拟路径提供程序与 DotNetNuke 一起使用?

asp.net-mvc-3 - SQLite CreateDatabase 不支持错误

javascript - 如何将带有 html 片段的 javascript 加载到现有的 Web 应用程序中

c# - ASP.NET 系统.Web.优化 : Bundling jQueryUI CSS

从模型加载 XML 时出现 Javascript 意外标记 '<'