我正試圖從數據庫加載Razor視圖。爲什麼MVC 5不調用我的VirtualPathProvider類的GetFile方法?
我按照ASP.NET MVC and virtual views和VirtualPathProvider in MVC 5來做到這一點。
我的代碼:
的VirtualPathProvider:
public class DbPathProvider : VirtualPathProvider
{
public override bool FileExists(string virtualPath)
{
var page = FindPage(virtualPath);
if (page == null)
{
return base.FileExists(virtualPath);
}
else
{
return true;
}
}
public override VirtualFile GetFile(string virtualPath)
{
var page = FindPage(virtualPath);
if (page == null)
{
return base.GetFile(virtualPath);
}
else
{
return new DbVirtualFile(virtualPath, page.PageData.ToArray());
}
}
private SiteModel FindPage(string virtualPath)
{
var db = new DatabaseContext();
var page = db.SiteModels.FirstOrDefault(x => x.SiteName == virtualPath);
return page;
}
}
VirtualFile
public class DbVirtualFile : VirtualFile
{
private byte[] data;
public DbVirtualFile(string virtualPath, byte[] data)
: base(virtualPath)
{
this.data = data;
}
public override System.IO.Stream Open()
{
return new MemoryStream(data);
}
}
的Global.asax:
protected void Application_Start()
{
HostingEnvironment.RegisterVirtualPathProvider(new DbPathProvider());
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
行動:
public ActionResult Display(string id)
{
var db = new DatabaseContext();
var site = db.SiteModels.FirstOrDefault(x => x.PageName == id);
if (site == null)
{
return RedirectToAction("Index", "Home");
}
ViewBag.Body = site.PageContent;
return View(System.IO.Path.GetFileNameWithoutExtension(site.SiteName));
}
數據:
情況1:
當virtualPath值爲「/Views/Home/Contact.cshtml」然後FILEEXISTS方法返回真和的GetFile方法被稱爲。
案例2:
當virtualPath值「〜/首頁/顯示/ ce28bbb6-03cb-4bf4-8820-373890396a90」然後FILEEXISTS方法的返回真正和GetFile方法和顯示行動從來都不是調用。,結果爲
HTTP錯誤404.0 - 未找到 您正在查找的資源已被刪除,名稱已更改或暫時無法使用。
我不知道動態視圖。我剛剛閱讀了這兩篇文章並試圖實現它。
請告訴我我做錯了什麼。
我使用MVC 5和.NET 4.5
能不能介紹一下爲什麼GetCacheDependency返回null評論,爲什麼GetFileHash返回新Guid.NewGuid()? –
當然,這是因爲我禁用從數據庫中提取的項目緩存 – r3plica
謝謝!在這裏省了很多時間......在我的情況下,還需要在路由配置中添加'routes.RouteExistingFiles = true;',否則'404找不到'。 –