Razor -编写一些未编码的东西,而不使用html helper

本文关键字:helper html 编码 Razor | 更新日期: 2023-09-27 17:51:23

我正在寻找一种方法来写一个值在我的剃刀视图,不编码它,而不使用Html Helper。

我在一个混合网站中渲染视图,在那里我以编程方式解析我的视图,像这样:

 string html = "<html>@("Write something <strong>unencoded</strong>"</html>")
 html = Razor.Parse<TModel>(html, model);

基本上,我的html变量包含一个包含razor c#代码的模板。因为我像这样编译我的视图,我没有访问Html助手(在这篇文章中接受的答案暗示这确实是这种情况:如何在ASP中渲染Razor视图为字符串。. NET MVC 3?)

但是,我的html变量也包含这样的语句:

 @Html.Raw("<strong>This should be printed unencoded</strong>")

这不起作用,但给出"Html在此上下文中不可用"。

我怎样才能达到同样的行为?使用响应。Write给出完全相同的错误。

还有其他方法吗?

注意:这是一个混合网站,包含经典的ASP webforms和一些新的Web API和MVC的东西。我使用的视图不是通过传统的MVC方式访问的

Razor -编写一些未编码的东西,而不使用html helper

HtmlString类型的字符串应该适合你。

表示一个html编码的字符串,不应该再次编码。

示例创建这样的字符串内联(通常你会有这样的值在Model由控制器设置):

  @(new HtmlString("<strong>This should be printed unencoded</strong>"))

我花了一段时间才弄清楚,但这是最终的解决方案(它适用于我,但有一些安全隐患,所以请继续阅读!)

像这样编译你的视图

var config = new TemplateServiceConfiguration();
config.EncodedStringFactory = new RawStringFactory();
var service = RazorEngineService.Create(config);
html = service.RunCompile(html, "templateNameInTheCache", null, model);

可以看到,我使用RawStringFactory来确保没有任何HTML被编码。当然,MVC会自动编码HTML作为安全预防措施,所以这样做不是很安全。只有当你100%确定整个Razor视图中的所有输出都是安全的时候才这样做!