是否有mvc4剃刀任何的VirtualPathProvider工作样本?(Is there any

2019-08-17 11:08发布

我看了几十个相关的线程并提出从样品我非常简单的虚拟供应商。

不过, 这并不使虚拟文件流。 只是显示计划文本。

这里是输出。

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

大约有此相关的线程,但他们没有说他们如何解决它或解决方案不起作用。 我无法找到我怎么错了。

  • 的VirtualPathProvider不解析剃刀标记
  • MVC3自定义的VirtualPathProvider不渲染剃刀
  • 从数据库中提取视图,而不是一个文件
  • 如何使用区域时指定路由共享视图中MVC3
  • 从数据库ASP.NET MVC负荷Razor视图
  • 如何加载从一个类库项目的看法?

并且有很多更多...

怎么了 ?

这是我的测试代码。 (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>"));
        }
    }
}

Answer 1:

我可以看到这个问题是有点老,但我只是遇到了同样的错误。 我相信这个问题是测试URL。 我没有时间充分调查,但我认为,除非提供的URL是预期的格式(ASP.NET MVC视图引擎是基于惯例),那么它可能不使用剃须刀作为视图引擎; 我不知道如果是这样的原因,但使用您正在使用的“红外线”的字符串一些例子:

新的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);
}


文章来源: Is there any VirtualPathProvider working sample in mvc4 razor?