2011-03-07 16 views
49

Estoy usando Razor en mi proyecto MVC3. Y también estoy usando el plugin JQuery de FullCalendar. Entonces, cuando intento llenar la matriz, funciona bien. Excepto una cosa. Si en el nombre contiene un apóstrofo, se representa como ' que no es lo que quiero. Traté de usar diferentes métodos como Encode y Decode e incluso MvcHtmlString.Create y result siempre es el mismo.caracteres JavaScript, Razor y Escape. Como un apóstrofo

Aquí es el fragmento de código:

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

Respuesta

78

que iba a escribir su foreach así:

  @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 para saltar el html escapar.
  • <text> es mejor para la salida de varias líneas.
+0

que realmente funcionó! excepto que necesito tomar el título entre comillas dobles y prohibir su uso en los nombres de las sesiones – Agzam

+2

¿Esto no escapa a los apóstrofes? –

+3

Danny, mira mi respuesta para escapar/codificación. – Fabrice

1

Dijiste que ya ha probado MvcHtmlString.Create, pero para mí, esto parece funcionar correctamente para mí:

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

.

Actualización:

Tomé su código &#39;, lo puso en el navegador, copiado lo que mostró en ese país, poner de nuevo en Visual Studio, como:

@MvcHtmlString.Create("'") 

Y lo hizo el trabajo, Solo obtuve ', no &#39;.

.

Actualización 2:

Esto también funciona:

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

cambiado esto: @: título: '@ s.Name', en esto: @: título: '@ MvcHtmlString.Create (@ s.Name) ', ..... No funcionó. No representa nada en la pantalla – Agzam

+0

, pero si pongo algo '@ MvcHtmlString.Create ("alguna cadena con una cita'") '- funciona. – Agzam

+0

¿Cuál es la codificación de la página y de la cadena real en 1s.Name'? ¿Tal vez éste es el problema? Intenta asegurarte de que en tu navegador veas la página en UTF-8 o tal vez? – Meligy

3

Trate de esta manera:

$(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 pueden requerir algunas modificaciones para lograr el resultado deseado (en términos de propiedad nombres), lo que me lleva a la observación habitual que hago sobre ViewBag cuando veo a alguien usando g it: usar ViewBag es una mala práctica y le recomendaría que use una vista fuertemente tipada con un modelo de vista.

+0

Wow ... wow ... wow ... eso es interesante ... podría decirme cómo es que la estructura (ViewBag.Session) debería verse? Todavía no soy tan bueno con javascript y no estoy seguro de cómo se vería la estructura similar en C#. Lo siento – Agzam

+0

@Agzam, le sugerí encarecidamente que no use 'ViewBag' en la acción de su controlador. Pero si insiste en que 'ViewBag.Sessions' debe ser un' IEnumerable 'donde' T' es una clase con propiedades: 'Title',' Start' y 'End'. Por ejemplo: 'ViewBag.Sessions = new [] {new {Title: 'foo', Start: DateTime.Now, End: DateTime.Now.AddHours (5)}};' –

+0

Esto fallará si la cadena contiene ' '? :( –

70

Aquí es cómo hacerlo:

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

muy bueno. Este es el camino a seguir. –

+0

Esto es útil cuando se usa'' @ Html.Raw (HttpUtility.JavaScriptStringEncode (Resources.MyFile) .ResourceName)) '' con texto que contiene HTML, ya que las traducciones pueden contener apóstrofes, etc. – lko

+0

¿Esto no funciona en el orden incorrecto? Primero queremos decodificar html y luego codificar e la cadena de javascript. –

Cuestiones relacionadas