【发布时间】:2014-07-19 18:41:39
【问题描述】:
我正在尝试从数据库加载 Razor View。
我关注 ASP.NET MVC and virtual views 和 VirtualPathProvider in MVC 5 来做这件事。
我的代码:
虚拟路径提供者:
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;
}
}
虚拟文件
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);
}
}
全球.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));
}
数据:
案例一:
当 virtualPath 值为 "/Views/Home/Contact.cshtml" 时,FileExists 方法返回 true 并调用 GetFile 方法。
案例2:
当 virtualPath 值为 "~/Home/Display/ce28bbb6-03cb-4bf4-8820-373890396a90" 时 FileExists 方法返回 true 和 GetFile 方法和Display Action 永远不会被调用。 结果是
HTTP 错误 404.0 - 未找到 您要查找的资源已被删除、名称已更改或暂时不可用。
我对动态视图一无所知。我刚刚读了那两篇文章并尝试实现它。
请告诉我哪里做错了。
我正在使用 MVC 5 和 .NET 4.5
【问题讨论】:
标签: c# asp.net asp.net-mvc razor