我目前正在尝试在较旧的WebForms项目中实现Razor Web页面,并且还可以从字符串呈现部分视图(从其他地方的数据库中获取)。我已经使用此处指定的所有覆盖实现了自定义VirtualPathProvider:ASP.NET MVC and Virtual views并且还覆盖了这些方法:
public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart)
{
if (virtualPath.Contains("RazorMigration.cshtml") && HttpContext.Current.Items.Contains("RazorTestingPage"))
{
return null;
}
return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
}
public override String GetFileHash(String virtualPath, IEnumerable virtualPathDependencies)
{
if (virtualPath.Contains("RazorMigration.cshtml") && HttpContext.Current.Items.Contains("RazorTestingPage"))
{
return Guid.NewGuid().ToString();
}
return Previous.GetFileHash(virtualPath, virtualPathDependencies);
}
然后当我尝试实际渲染页面时(completeTemplate已经包含已经解析过razor的纯HTML),如下所示:
var rt = new RouteData();
rt.Values.Add("controller", "WebFormShimController");
var httpCtx = new HttpContextWrapper(System.Web.HttpContext.Current);
var ctx = new ControllerContext(new RequestContext(httpCtx, rt), new WebFormShimController());
try
{
HttpContext.Current.Items.Add("RazorTestingPage", completeTemplate);
IView view = ViewEngines.Engines.FindPartialView(ctx, System.IO.Path.GetFileName("RazorMigration")).View;
ViewContext vctx = new ViewContext(ctx, view,
new ViewDataDictionary { Model = model },
new TempDataDictionary(), httpCtx.Response.Output);
view.Render(vctx, System.Web.HttpContext.Current.Response.Output);
}
我总是抓住Exception On view.Render这句话说:
c:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET Files \ root \ 0e7dfb6a \ c63cc9d1 \ App_Web_razormigration.cshtml.afd51fd3.jujzzimy.0.cs(41):error CS1009:无法识别的转义序列
我不确定这里的问题是什么,或者这条路径的构建方式和方式。如果有人能指出我正确的方向,我会非常高兴,因为我试图让它工作近一个星期,但仍然没有成功。
编辑:我发现了这个错误 - 写入文件时是在我的编码中(所以当文件被写入时\ NUL字符被添加,这混淆了IIS) 现在我收到了这个错误:CS0115: c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\0e7dfb6a\c63cc9d1\App_Web_4b7b71f4-87c2-4364-be0e-19ec2a81ceccR.0.cs.Execute()': no suitable method found to override
我确信我的观点中没有错误,因为它只包含此内容:
<h1>Hello</h1>