【问题标题】:Razor Escaping my html even if I use Html.Raw即使我使用 Html.Raw,剃刀也会转义我的 html
【发布时间】:2014-01-07 18:46:46
【问题描述】:

我遇到了一个问题,我的动态生成的 html 被转义并输出到屏幕上。这就是我所拥有的:

 @{
      string TrialMessage = string.Empty;
      if ((bool)ViewBag.msd.IsOnTrial == true)
      {
           var expDate = (DateTime)ViewBag.msd.RenewalDate;
           var daysToTrialExpiation = expDate.AddDays(1) - System.DateTime.UtcNow;

           TrialMessage = "<b>Trial Ends in: <span style=\"color:[Color];\">" + (daysToTrialExpiation.Days) + "</span> Days</b>";
           if (daysToTrialExpiation.Days > 5)
           {
                TrialMessage = TrialMessage.Replace("[Color]", "green");
           }
           else if (daysToTrialExpiation.Days > 2)
           {
                TrialMessage = TrialMessage.Replace("[Color]", "orange");
           }
           else if (daysToTrialExpiation.Days > 0)
           {
                TrialMessage = TrialMessage.Replace("[Color]", "red");
           }
           else
           {
                TrialMessage = "<b style=\"color: red;\"> Trial Ended " + Math.Abs(daysToTrialExpiation.Days) + " Days Ago</b>";
           }
      } 
 }

当我在视图中使用 TrialMessage 时,我会在屏幕上输出它的转义版本:

<b>Trial Ends in: <span style="color:green;">15</span> Days</b>

我曾尝试使用Html.Raw(TrialMessage),我什至尝试手动创建HTMLString,结果相同。我错过了什么?

更新:我在视图上输出的方式是:

@Html.Raw(TrialMessage)

【问题讨论】:

  • 只是一个简短的说明;我强烈建议不要在视图中执行这样的逻辑。我建议为此视图构建一个 ViewModel 类,它会为您计算过期时间,这样您就可以将正确的值发送到视图,而无需在视图中存在此逻辑。这也将导致到期计算可在其他地方重复使用,而无需重复(如果您遵循良好的 OOP 原则)。您可能还希望创建一些客户 HtmlHelpers 来帮助生成您的自定义 html...再次尽可能避免在视图中进行处理。
  • 将整行代码贴在你正在做 Html.Raw() 的地方
  • @quakkels,感谢您的建议,昨晚已经很晚了,我需要尽快解决这个问题(虽然没有发生)是的,我一定会这样做。话虽如此,这个问题仍然困扰着我,因为我找不到任何问题并且它不起作用大声笑
  • @iamkrillin,刚刚更新了问题
  • @hjavaher Html.Raw 应该可以工作。也许你在别处犯了错误。发布你的完整代码

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


【解决方案1】:

为了让它正常工作(看起来你时间紧迫),如果你从变量中删除 html 会怎样?

也许这样的事情对你有用:

@{
  string trialColor = string.Empty;
  int trialDays = 0;
  if ((bool)ViewBag.msd.IsOnTrial)
  {
    var expDate = (DateTime)ViewBag.msd.RenewalDate;
    var trialDays = (expDate.AddDays(1) - System.DateTime.UtcNow).Days;

    if (trialDays > 5)
    {
      trialColor = "green";
    }
    else if (trialDays > 2)
    {
      trialColor = "orange";
    }
    else
    {
      trialColor = "red";
    }
  } 
}

...

@if((bool)ViewBag.msd.IsOnTrial && trialDays > 0)
{
  <strong>Trial Ends in: <span style="color:@trialColor;">@trialDays </span> Days</strong>
} else if((bool)ViewBag.msd.IsOnTrial) {
  <strong style="color: red;">Trial Ended @Math.Abs(trialDays) Days Ago</strong>
}

注意:未经测试的代码。写剃须刀已经有一段时间了。

【讨论】:

  • 这是实现这一目标的更好方法。 “终极”方法是在返回视图模型的服务中包含此业务逻辑。
  • @Tommy - 你是对的。理想情况下,上面的显示代码只需要很少的更改,上面的逻辑将在 class/viewModel/someothertestablesolution 中。
  • 嗨 quakkels,这正是我最终要做的(再次因为时间原因)我不能真正使用 viewModel,因为这些信息实际上来自每个视图都需要的控制器级别的操作过滤器和控制器。话虽如此,它仍然困扰着我为什么上面的代码不起作用大声笑这是 html.raw 助手或剃刀中的错误吗?
  • 很难说这是否是一个错误。我无法复制该问题。
猜你喜欢
  • 1970-01-01
  • 2013-05-05
  • 2020-08-18
  • 1970-01-01
  • 2017-03-30
  • 2016-04-29
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多