剃刀 - 在不使用html帮助器的情况下编写未编码的内容

时间:2015-06-01 22:07:08

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor

我正在寻找一种在我的剃刀视图中编写值的方法,无需编码,并且不使用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方式访问的。

2 个答案:

答案 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视图中的所有输出都是安全的时才执行此操作!