2011-03-07 77 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