Подтвердить что ты не робот

Javascript, Razor и Escape. Как апостроф

Я использую 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>

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 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, когда вижу, что кто-то его использует: использование ViewBag - это плохая практика и я бы рекомендовал вам использовать строго типизированное представление с моделью просмотра.

Ответ 4

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

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

.

Update:

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

@MvcHtmlString.Create("'")

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

.

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

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

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

Ответ 5

HttpUtility.JavaScriptStringEncode здесь на самом деле не требуется. Просто '@Html.Raw(s.Name)' '' 'работает для меня.