2014-01-07 52 views
0

我有一個問題,我的動態生成的HTML越來越逃脫和輸出在屏幕上。繼承人我有什麼:剃刀逃離我的HTML,即使我使用Html.Raw

@{ 
     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) 
+1

只是一個簡短的說明;我強烈建議不要在視圖中執行這樣的邏輯。我建議爲這個視圖建立一個ViewModel類來計算你的到期時間,這樣你就可以在視圖中沒有這個邏輯的情況下發送正確的值到視圖。這也會導致到期計算在其他地方可以重複使用而無需重複使用(如果遵循良好的OOP原則)。您可能還想看看int,讓一些客戶HtmlHelpers幫助您生成自定義html ...再一次避免在視圖中儘可能進行處理。 ()) – quakkels

+0

發佈你正在做的整個代碼行Html.Raw() – iamkrillin

+0

@quakkels,謝謝你的建議,昨天晚上很晚,我需要儘快解決這個問題(雖然沒有發生)是的,一定要確保這樣做。這就是說,這個問題仍然困擾着我,因爲我找不到任何錯誤和它不工作大聲笑 – hjavaher

回答

2

在努力只得到它的工作(好像你趕時間),如果你刪除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> 
} 

注:未經測試的代碼。從我寫剃刀開始就有點過了。

+1

這是實現此目標的更好方法。 「最終」方法是在返回視圖模型的服務中擁有此業務邏輯。 – Tommy

+0

@Tommy - 你說得對。理想情況下,上面的顯示代碼只需要很少的更改,上面的邏輯將在class/viewModel/someothertestablesolution中。 – quakkels

+0

嗨quakkels,這正是我最終做的事(再次因爲時間)我不能真正使用viewModel,因爲這些信息實際上來自每個視圖和控制器所需的控制器級別動作過濾器。有了這個說法,它仍然困擾着我爲什麼上面的代碼不工作大聲笑這是一個錯誤在html.raw助手或剃鬚刀? – hjavaher