web-dev-qa-db-fra.com

Javascript, rasoir et caractères d'échappement. Comme l'apostrophe

J'utilise Razor dans mon projet MVC3. Et j'utilise également le plugin FullCalendar JQuery. Donc, quand j'essaie de remplir le tableau, cela fonctionne bien. Sauf une chose. Si s.Name contient une apostrophe, elle se présente comme' ce n'est pas ce que je veux. J'ai essayé d'utiliser différentes méthodes comme Encode et Decode et même MvcHtmlString.Create et le résultat est toujours le même.

Voici l'extrait de code:

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

J'écrirais votre foreach comme ceci:

            @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 pour ignorer l'échappement html.
  • <text> est plus agréable pour la sortie multiligne.
102
GvS

Voici comment faire:

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

Essayez comme ceci:

$(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 peut nécessiter quelques modifications pour obtenir le résultat souhaité (en termes de noms de propriété), ce qui m'amène à la remarque habituelle que je fais à propos de ViewBag quand je vois quelqu'un l'utiliser: utiliser ViewBag est mauvaise pratique et je vous recommande d'utiliser une vue fortement typée avec un modèle de vue.

3
Darin Dimitrov

Vous avez dit que vous avez déjà essayé MvcHtmlString.Create, mais pour moi, cela semble fonctionner correctement pour moi:

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

.

Mise à jour:

J'ai pris ton code &#39;, mettez-le dans le navigateur, copiez ce qui y est affiché, remettez-le dans Visual Studio, comme:

@MvcHtmlString.Create("'")

Et cela a fonctionné, je n'ai eu que ' retour, pas &#39;.

.

Mise à jour 2:

Cela fonctionne également:

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

HttpUtility.JavaScriptStringEncode n'est pas vraiment requis ici. Simplement

 '@Html.Raw(s.Name)'

est travaillé pour moi.

0
Vijai Sebastian