2011-03-07 93 views
49

我在我的MVC3項目中使用Razor。而且我正在使用FullCalendar JQuery插件。所以當我嘗試填充陣列時,它的效果很好。除了一件事。如果s.Name包含撇號它呈現像'這不是我想要的。我試圖使用不同的方法,如編碼和解碼,甚至MvcHtmlString.Create和結果總是相同的。Javascript,剃刀和逃逸字符。像撇號

這裏是代碼片段:

<head> 
    <script type='text/javascript'> 
     $(document).ready(function() {   
     $('#calendar').fullCalendar({ 
      header: { 
       left: '', 
       center: 'title', 
       right: 'month,agendaWeek,agendaDay' 
      }, 
      month: 5, 
      year: 2011, 
      editable: false, 
      events: [ 
      @foreach (var s in ViewBag.Sessions) 
      { 
       @:{ 
       @: title: '@s.Name', 
       @: start: new Date(@s.Starts.Year, @s.Starts.Month-1, @s.Starts.Day), 
       @: end: new Date(@s.Ends.Year, @s.Ends.Month-1, @s.Ends.Day) 
       @:}, 
      } 
        ] 
     }); 
    }); 
</script> 

回答

78

我會寫你的foreach這樣的:

  @foreach (var s in ViewBag.Sessions) 
      { 
       <text> 
       { 
       title: '@Html.Raw(HttpUtility.JavaScriptStringEncode(s.Name))', 
       start: new Date(@s.Starts.Year, @s.Starts.Month-1, @s.Starts.Day), 
       end: new Date(@s.Ends.Year, @s.Ends.Month-1, @s.Ends.Day) 
       }, 
       </text> 
      } 
  • Html.Raw跳過HTML逃逸。
  • <text>更適合多行輸出。
+0

實際上工作!除了我需要把標題變成雙引號,並禁止在Sessions的名字中使用它們 – Agzam 2011-03-08 16:19:22

+2

這並不能逃脫撇號? – 2013-04-23 07:38:20

+3

Danny,請參閱我的轉義/編碼答案。 – Fabrice 2013-09-18 21:12:03

1

你說你已經嘗試過MvcHtmlString.Create,但對我來說,這似乎爲我正常工作:

'Trying @MvcHtmlString.Create("Testing'`")' 

更新:

我把你的代碼&#39;,把它放在瀏覽器,複製他們的表現在那裏,把它放回在Visual Studio中,如:

@MvcHtmlString.Create("'") 

而且它的工作,我只收到',而不是&#39;

更新2:

這也適用於:

@{ViewBag.Symbol = "'";} 
@MvcHtmlString.Create(ViewBag.Symbol) 
+0

改變這樣的:@:標題: '@ s.Name',這個:@:標題:「@ MvcHtmlString.Create(@ s.Name )',.....沒有工作。對屏幕 – Agzam 2011-03-07 22:19:14

+0

沒有任何提示,但是如果我把'@ MvcHtmlString.Create(「一些帶有引號的字符串'')'' - 它的作品。 – Agzam 2011-03-07 22:21:51

+0

什麼是頁面的編碼和1s.Name'中的實際字符串的編碼?也許這是問題?嘗試確保在瀏覽器中以UTF-8或更高版本查看頁面? – Meligy 2011-03-07 22:22:05

3

嘗試這樣的:

$(function() {   
    $('#calendar').fullCalendar({ 
     header: { 
      left: '', 
      center: 'title', 
      right: 'month,agendaWeek,agendaDay' 
     }, 
     month: 5, 
     year: 2011, 
     editable: false, 
     events: @Html.Raw(new JavaScriptSerializer().Serialize(ViewBag.Sessions)) 
    }); 
}); 

ViewBag.Sessions可能需要進行一些修改,以達到預期的效果(在財產方面名字),當我看見有人在使用時,它給我帶來了關於ViewBag的常見說法g it:使用ViewBag是不好的做法,我建議你在視圖模型中使用強類型視圖。

+0

哇...哇...這很有趣...你能告訴我如何結構(ViewBag.Session)應該看起來?我還沒有很好的JavaScript,但我不知道類似的結構將如何在c#中看起來像。對不起 – Agzam 2011-03-07 23:03:41

+0

@Agzam,我強烈建議你不要在控制器動作中使用'ViewBag'。但是如果你堅持'ViewBag.Sessions'應該是一個'IEnumerable ',其中'T'是一個具有屬性:'Title','Start'和'End'的類。例如:'ViewBag.Sessions = new [] {new {Title:'foo',Start:DateTime.Now,End:DateTime.Now.AddHours(5)}};' – 2011-03-07 23:08:56

+0

如果字符串包含' '?:( – 2015-06-02 14:09:53

70

這裏是如何做到這一點:

title: '@Html.Raw(HttpUtility.JavaScriptStringEncode(s.Name))' 
+0

非常好。這是要走的路。 – 2013-09-23 16:00:27

+0

當使用'@ Html.Raw(HttpUtility.JavaScriptStringEncode(Resources.MyFile .ResourceName))''帶有包含HTML的文本作爲翻譯可能包含撇號等 – lko 2013-10-25 07:05:56

+0

這不正確的順序嗎?我們想先解碼html,然後編碼e javascript字符串。 – 2014-08-05 02:39:22