我正在寻找一种在我的剃刀视图中编写值的方法,无需编码,并且不使用Html Helper。
我正在混合网站中呈现视图,我以编程方式解析我的视图,如下所示:
string html = "<html>@("Write something <strong>unencoded</strong>"</html>")
html = Razor.Parse<TModel>(html, model);
基本上,我的html变量包含一个包含razor c#代码的模板。因为我正在编译这样的视图,所以我无法访问Html帮助器(本文中接受的答案暗示确实如此:How to render a Razor View to a string in ASP.NET MVC 3?)
但是,我的html变量还包含如下语句:
@Html.Raw("<strong>This should be printed unencoded</strong>")
这不起作用,但是“Html在此上下文中不可用”。
如何实现相同的行为?使用Response.Write会产生完全相同的错误。
还有其他方法吗?
注意:这是一个混合网站,包含经典ASP网页表格和一些较新的Web API和MVC内容。我正在使用的视图不是通过传统的MVC方式访问的。
答案 0 :(得分:1)
HtmlString类型的字符串应该适合您。
表示不应再次编码的HTML编码字符串。
创建此类字符串内联的示例(通常您在控制器设置的Model
中具有此类值):
@(new HtmlString("<strong>This should be printed unencoded</strong>"))
答案 1 :(得分:1)
我花了一段时间才弄明白,但这是最终解决方案(对我有用,但有一些安全隐患,请继续阅读!)
像这样编译您的视图
var config = new TemplateServiceConfiguration();
config.EncodedStringFactory = new RawStringFactory();
var service = RazorEngineService.Create(config);
html = service.RunCompile(html, "templateNameInTheCache", null, model);
正如您所看到的,我使用了RawStringFactory
来确保没有任何HTML被编码。当然,MVC会自动将HTML编码为安全预防措施,因此这样做并不是很安全。 只有在您完全确定整个Razor视图中的所有输出都是安全的时才执行此操作!