“RazorEngine.Templating.TemplateCompilationException”类型的异常在 RazorEngine.NET4.0.dll 中发生,但未在用户代码中进行处理

时间:2021-12-20 06:30:08

错误信息:

“RazorEngine.Templating.TemplateCompilationException”类型的异常在 RazorEngine.NET4.0.dll 中发生,但未在用户代码中进行处理

其他信息: Unable to compile template. “object”不包含“username”的定义,并且找不到可接受类型为“object”的第一个参数的扩展方法“username”(是否缺少 using 指令或程序集引用?)

Other compilation errors may have occurred. Check the Errors property for more information.

解决方法:

这个异常是由Razor.Parse()方法抛出的。

需要将传给cshtml的model给序列化一下,在传递过去,不然就会报错。

1.有可能是传递过去的model是匿名类,但有时声明了一个类也会报这个错误。(可尝试声明一个类传递过去)

2.第一个方法不行就只能用下面的方法,把这个model序列化一下再传递给cshtml,这个方法返回一个动态类型的model。如下:

static dynamic ToDynamic(object obj)
{
string json = JsonConvert.SerializeObject(obj);
dynamic dyObj = JsonConvert.DeserializeObject(json);
return dyObj;
}

这个方法需要引入Newtonsoft.Json.dll库(用最新的.net4.5的)

PS:在cshtml最开始最好放上:(注意大小写)

@model dynamic

这回 再在编译cshtml代码时,就不会再报上面的错误。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

不得不对这篇文章进行一下修改:

使用上面的方法虽然能够解决程序不报错了,但是在反射中,使用第2种方法去传递model,还是会报同样的异常。

解决方法:

1.还是使用Razor.Parse()方法,只不过给这个方法加了个重载,Razor.Parse<T>() :T为要传递的model的类型。

2.这时候传递model就不能是匿名类了。不然还是会报异常“System.InvalidCastException”。

        public static string ParseRazor<T>(HttpContext context,
string csHtmlVirtualPath, object model = null)
{
T myModel = (T)model;
string fullpath = context.Server.MapPath(csHtmlVirtualPath);
string cshtml = File.ReadAllText(fullpath);
string cacheName = fullpath + File.GetLastWriteTime(fullpath);
string html = Razor.Parse(cshtml, myModel, cacheName);
return html;
}