Asp.net mvc 即使我使用html.Raw,我也会逃离我的html

Asp.net mvc 即使我使用html.Raw,我也会逃离我的html,asp.net-mvc,asp.net-mvc-4,razor,Asp.net Mvc,Asp.net Mvc 4,Razor,我遇到了一个问题,动态生成的html被转义并输出到屏幕上。以下是我所拥有的: @{ string TrialMessage = string.Empty; if ((bool)ViewBag.msd.IsOnTrial == true) { var expDate = (DateTime)ViewBag.msd.RenewalDate; var daysToTrialExpiation = expDate.AddD

我遇到了一个问题,动态生成的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>";
           }
      } 
 }

为了让它正常工作(看起来时间紧迫),如果从变量中删除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.isontral&&trialDays>0)
{
审判将于:@Trialday天结束
}否则如果((bool)ViewBag.msd.IsOnTrial){
试用在@Math.Abs(试用日)前结束
}

注意:未测试的代码。自从我写《剃刀》以来,已经有一段时间了。

只是一个简短的说明;我强烈建议不要在视图中执行这样的逻辑。我建议为此视图构建一个ViewModel类,该类为您计算过期时间,这样您就可以向视图发送正确的值,而不必在视图中使用此逻辑。这还将导致过期计算可以在其他地方重用,而无需重复(如果遵循良好的OOP原则)。您可能还希望通过制作一些客户html帮助来帮助生成自定义html。。。再一次,为了尽可能避免在视图中进行处理,请将整行代码张贴在您正在执行Html.Raw()@quakkels的地方,感谢您的建议,昨晚已经很晚了,我需要尽快将其发布(虽然没有发生)是的,我一定会这样做。尽管如此,这个问题仍然困扰着我,因为我找不到它有任何问题,它也不起作用lol@iamkrillin,刚更新了question@hjavaher
Html.Raw
应该有效。也许你在其他地方犯了错误。发布完整的代码这是实现此目标的更好方法。“终极”方法是在返回视图模型的服务中包含此业务逻辑。@Tommy-你说得对。理想情况下,上面的显示代码只需要很少的更改,上面的逻辑将在class/viewModel/someothertestablesolution中。嗨,夸克尔,这正是我最终要做的(同样是因为时间)我不能真正使用viewModel,因为这些信息实际上来自每个视图和控制器中所需的控制器级操作过滤器。尽管如此,上面的代码为什么不起作用仍然困扰着我。哈哈,这是html.raw helper还是razor中的一个bug?很难说这是不是一个bug。我无法复制这个问题。
@Html.Raw(TrialMessage)
@{
  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>
}