Javascript、Razor和转义字符。比如撇号

60

我在我的MVC3项目中使用Razor。同时我也在使用FullCalendar JQuery插件。所以当我尝试填充数组时,它可以正常工作。除了一个问题。如果s.Name包含撇号,它会呈现为',这不是我想要的。我尝试使用不同的方法,比如Encode和Decode,甚至是MvcHtmlString.Create,结果总是一样的。

以下是代码片段:

<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>

5个回答

116

我会将你的 foreach 写成这样:

            @foreach (var s in ViewBag.Sessions)
            { 
                <text>
                {
                 title: '@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>
            }
  • 使用HttpUtility.JavaScriptStringEncode方法转义引号和HTML标记。
  • <text>更适合多行输出。

3
这个不能排除撇号吗? - Danny Tuppeny
4
丹尼,请查看我的逃脱/编码答案。 - Fabrice
1
@Fabrice 是的,我看到了;我只是生气接受的答案容易被滥用 ;O( - Danny Tuppeny
2
如果字符串包含 '</script>',这也会失败 :( - Danny Tuppeny
2
这似乎可以在没有html.raw的情况下工作,所以在我的情况下,Razor:string msg =“test's”,然后onclick =“confirmRun('@HttpUtility.JavaScriptStringEncode(msg)')”运行良好。添加html.raw的原因是什么? - eaglei22
显示剩余4条评论

86

以下是如何实现的:

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

非常好。这是正确的方式。 - Papa Burgundy
当使用包含HTML的文本时,'@Html.Raw(HttpUtility.JavaScriptStringEncode(Resources.MyFile.ResourceName))'非常有用,因为翻译可能包含撇号等。 - lko
1
如果您想解码HTML,则应使用HttpUtility.HtmlDecode。 - Fabrice
我误解了。谢谢。 - Max Strater
如果字符串包含 '</script>',这将失败 :( - Danny Tuppeny
显示剩余2条评论

5
尝试像这样做:
$(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的通常评论:使用ViewBag是不好的做法,我建议您使用具有视图模型的强类型视图。


哇...哇...哇...太有趣了...你能告诉我这个结构(ViewBag.Session)应该是什么样子的吗?我对JavaScript还不是很熟悉,也不确定在C#中类似的结构会是什么样子。抱歉。 - iLemming
@Agzam,我强烈建议你不要在控制器操作中使用ViewBag。但是如果你坚持,ViewBag.Sessions应该是一个IEnumerable<T>,其中T是一个具有属性TitleStartEnd的类。例如:ViewBag.Sessions = new[] { new { Title: 'foo', Start: DateTime.Now, End: DateTime.Now.AddHours(5) } }; - Darin Dimitrov
如果字符串包含 '</script>',这将失败 :( - Danny Tuppeny
@DannyTuppeny,如何重现您的问题?以下代码可以正常工作:<script> @{ var text = "let's use </script>"; } alert('@Html.Raw(HttpUtility.JavaScriptStringEncode(text))'); </script> - Fabrice
@Fabrice 当我尝试时,它并没有起作用;因为浏览器将字符串中的</script>标签解释为脚本标签的结尾(例如在这里查看)。你在哪个浏览器上测试过? - Danny Tuppeny
我不记得了。 这太糟糕了。我本以为自2012年以来这个漏洞已经被修复了。 - Fabrice

4

HttpUtility.JavaScriptStringEncode 在这里并不是真正必需的。 简单地说

 '@Html.Raw(s.Name)'

这对我有效。


1

你说你已经尝试过MvcHtmlString.Create,但对我来说,这似乎对我有效:

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

.

更新:

我将您的代码&#39;复制到浏览器中,然后将其中显示的内容复制回Visual Studio中,如下所示:

@MvcHtmlString.Create("'")

它确实起作用了,我只得到了'而不是&#39;

.

更新2:

这也可以工作:

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

将以下与程序相关的内容从英语翻译成中文。只返回已翻译的文本:将此更改为: @:title:'@s.Name',变成这样:@:title:'@MvcHtmlString.Create(@s.Name)',但是没有奏效。屏幕上没有任何输出。 - iLemming
但是如果我输入 '@MvcHtmlString.Create("some string with a quote '")' - 它可以正常工作。 - iLemming
1s.Name的页面和实际字符串的编码是什么?也许这就是问题所在?尝试确保在浏览器中以UTF-8或其他编码查看页面。 - Meligy
尝试使用@MvcHtmlString.Create(s.Name)进行操作,即不带'@'。 - willvv
哈哈,你和@willvv同时说了一样的话, :D - Meligy
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接