1
我已经创建了下面的虚拟路径提供加载从DB和意见时,认为不存在于磁盘上,我看到我的DB方法被调用,用于返回true
FileExists方法。在那之后,没有其他的方法被调用,页面返回的404次是在磁盘上仍然呈现良好。数据库调用GetByVirtualPath
只返回一个意见的内容。我已经验证了这个对象是与数据水合。MVC 5的VirtualPathProvider工作不正常
的VirtualPathProvider
public class CMSVirtualPathProvider : VirtualPathProvider
{
public override bool FileExists(string virtualPath)
{
return base.FileExists(virtualPath) || MVCViewVersion.GetByVirtualPath(virtualPath) != null;
}
public override VirtualFile GetFile(string virtualPath)
{
if (base.FileExists(virtualPath))
{
return base.GetFile(virtualPath);
}
else
{
return new CMSVirtualFile(virtualPath, this);
}
}
public override string GetFileHash(string virtualPath, IEnumerable virtualPathDependencies)
{
if (base.FileExists(virtualPath))
{
return base.GetFileHash(virtualPath, virtualPathDependencies);
}
else
{
#if DEBUG
return null;
#else
return string.Format("{0}{1}", virtualPath, DateTime.UtcNow.ToString("dd HH"));
#endif
}
}
public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart)
{
if (!base.FileExists(virtualPath))
{
return null;
}
return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
}
}
VirtualFile 此类从不打。
public class CMSVirtualFile : VirtualFile
{
private CMSVirtualPathProvider _ParentProvider;
public CMSVirtualFile(string virtualPath, CMSVirtualPathProvider parentProvider)
: base(virtualPath)
{
_ParentProvider = parentProvider;
}
public override System.IO.Stream Open()
{
string Content = string.Empty;
MVCViewVersion Version = MVCViewVersion.GetByVirtualPath(this.VirtualPath);
if (Version != null)
{
Content = Version.Content;
}
return new MemoryStream(ASCIIEncoding.Default.GetBytes(Content));
}
}
在global.asax中,我在Application_Start
方法中添加了以下链接。
HostingEnvironment.RegisterVirtualPathProvider(new CMSVirtualPathProvider());
我认为一些事情已经改变,因为这段代码在我以前的MVC4实现中起作用。我无法指责我做错了什么。
这花了我永远找到一个答案,我同样的问题。我在调试时忽略了差异。 –
@Matty:请注明您的答案,答案为未来的程序员更快地找到它。 – Oliver