[英]Dynamiclly created views using custom virtual path provider are not being rendered in MVC 4
利用Internet上可用的许多教程和讨论线程,创建了一个poc项目,用于从数据库渲染视图。 代码如下。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Hosting;
using System.Web.Mvc;
namespace WebApplication1
{
public class MyVirtualPathProvider:VirtualPathProvider
{
public override bool FileExists(string virtualPath)
{
String view = GetViewFromDatabase(virtualPath);
if (view == null)
{
return base.FileExists(virtualPath);
}
else
{
return true;
}
}
public override VirtualFile GetFile(string virtualPath)
{
String view = GetViewFromDatabase(virtualPath);
if (view == null)
{
return base.GetFile(virtualPath);
}
else
{
byte[] content = ASCIIEncoding.ASCII.GetBytes(view);
return new MyVirtualFile(virtualPath, content);
}
}
private String GetViewFromDatabase(string virtualPath)
{
if (virtualPath == "/Views/Dynamic/Index.cshtml")
{
string strView = @"@model List<String>
@{
ViewBag.Title = ""About"";
}
< h2 > @ViewBag.Title.</ h2 >
< h3 > @ViewBag.Message </ h3 >
< p > Use this area to provide additional information.</ p >
@if(Model != null)
{
< ul >
@foreach(String str in Model)
{
< li > @str </ li >
}
</ ul >
}";
return strView;
}
return null;
}
}
public class MyVirtualFile : VirtualFile
{
private byte[] viewContent;
public MyVirtualFile(string virtualPath, byte[] viewContent)
: base(virtualPath)
{
this.viewContent = viewContent;
}
public override Stream Open()
{
return new MemoryStream(viewContent);
}
}
}
动作方法如下
public class DynamicController : Controller
{
// GET: Dynamic
public ActionResult Index()
{
List<String> _model = new List<string>();
_model.Add("test1");
_model.Add("test2");
_model.Add("test3");
_model.Add("test4");
ViewBag.Message = "this mesage is from viewbag";
ViewBag.Title = "Test view created by Arvin";
return View("/Views/Dynamic/Index.cshtml", _model);
//return new FilePathResult("/Views/Dynamic/Index.cshtml", "text/html");
}
}
也对global.asax
文件进行了更改
protected void Application_Start()
{
HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider()); // my change
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
当我输入URL https://localhost:[myport_no]/Dynamic/Index
,我得到的是下图
您可以看到正确显示了突出显示的区域,即模型中传递的数据,但未呈现HTML。 。 这个问题似乎与其他问题重复,但是我已经遍历了大多数问题以找出确切的问题。 因此,如果您能对此提供见解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.