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>
Ответы
Ответ 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:
Я взял ваш код '
, поместил его в браузер, скопировал показанное там, вернул его в Visual Studio, например:
@MvcHtmlString.Create("'")
И это сработало, я только получил '
назад, а не '
.
.
Обновление 2:
Это также работает:
@{ViewBag.Symbol = "'";}
@MvcHtmlString.Create(ViewBag.Symbol)
Ответ 5
HttpUtility.JavaScriptStringEncode здесь на самом деле не требуется. Просто '@Html.Raw(s.Name)' '' 'работает для меня.