Javascript, Razor и Escape персонажи.Как апостроф - PullRequest
57 голосов
/ 08 марта 2011

Я использую Razor в своем проекте MVC3. А также я использую плагин 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>

Ответы [ 4 ]

100 голосов
/ 08 марта 2011

Я бы написал ваш 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> лучше для многострочного вывода.
79 голосов
/ 25 июля 2012

Вот как это сделать:

title: '@Html.Raw(HttpUtility.JavaScriptStringEncode(s.Name))'
3 голосов
/ 08 марта 2011

Попробуй так:

$(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 - плохая практика и я бы порекомендовал вам использовать строго типизированное представление с моделью представления.

1 голос
/ 08 марта 2011

Вы сказали, что уже пробовали MvcHtmlString.Create, но для меня это, кажется, работает правильно для меня:

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

.

Обновление:

Я взял ваш код &#39;, поместил его в браузер, скопировал то, что там показывалось, положил обратно в Visual Studio, например:

@MvcHtmlString.Create("'")

И это сработало, я получил только ', а не &#39;.

.

Обновление 2:

Это также работает:

@{ViewBag.Symbol = "'";}
@MvcHtmlString.Create(ViewBag.Symbol)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...