Razor.Parse替代方案咨询:无模板解析变量值的实现方式
替代过时的Razor.Parse,用Engine.Razor直接解析变量值
没问题,我之前也踩过Razor.Parse过时的坑,现在给你捋清楚怎么用Engine.Razor来替代它,不用搞复杂的模板:
首先,你得先确认安装了适配的NuGet包:
- 如果你用.NET Framework,直接装
RazorEngine包就行 - 要是用.NET Core/.NET 5+,建议装
RazorEngine.NetCore(专门适配新框架的版本)
虽然Engine.Razor没有直接的无模板重载,但我们可以用极简模板模拟原来的Razor.Parse行为——说白了就是把你要解析的变量字符串当作模板内容来处理。
直接解析单个变量的示例
你原来的代码是:
string value = Razor.Parse("@UserSession.NumberOfPeople");
现在可以改成这样:
// 把要解析的变量当作模板内容 var template = "@UserSession.NumberOfPeople"; // 用RunCompile执行,需要传入缓存键、模型(把变量上下文传进去) var result = Engine.Razor.RunCompile( template, "parse_people_count", // 唯一缓存键,避免重复编译,也可以用Guid生成 null, new { UserSession = UserSession } // 把需要的变量包装成模型对象 );
封装成类似Parse的便捷方法
要是想更贴近原来的用法,你可以自己封装一个扩展方法:
public static class RazorHelper { public static string Parse(this string razorContent, object model) { // 生成唯一缓存键,也可以用固定键(如果内容不变的话) var cacheKey = Guid.NewGuid().ToString(); return Engine.Razor.RunCompile(razorContent, cacheKey, null, model); } }
之后调用就和原来几乎一样了:
string value = "@UserSession.NumberOfPeople".Parse(new { UserSession = UserSession });
注意事项
- 确保
Engine.Razor已初始化:大部分新版本会自动初始化,要是遇到异常,可以在启动时手动加一句Engine.Razor = RazorEngineService.Create(); - 变量上下文要传对:原来的
@UserSession是当前代码上下文的变量,现在必须把它作为模型的一部分传给模板,不然模板会找不到这个变量 - 缓存键的使用:如果多次解析相同内容,用固定的缓存键能提升性能,避免重复编译模板
内容的提问来源于stack exchange,提问作者Pete
相关产品推荐
相关产品推荐

