2011-04-03 11 views
7

sto riuscendo a ottenere il FullCalendar plugin jQuery per legare a un array JSON proveniente da un'azione ASP.NET MVC3.FullCalendar non si legherà ai mangimi JSON da ASP.NET MVC3 Azione

Ho rimosso quasi tutto dal codice per cercare di dare la caccia al problema; Mi rimane questo, che da ogni post in modo e il blog che ho letto, dovrebbe funzionare:

azione (controllo Calendar)

public JsonResult Events(double start, double end) 
    { 
     var rows = new object[] { new { title="Event1", start= "2011-04-04" }, 
            new { title="Event2", start= "2011-04-05" } }; 
     return Json(rows, JsonRequestBehavior.AllowGet); 
    } 

View

<script type='text/javascript'> 
    $(document).ready(function() { 
    $('#calendar').fullCalendar({ 
     events: '@Url.Content("~/Calendar/Events")' 
    }) 
}); 

I risultati sono un calendario vuoto, senza eventi vincolanti. Ho verificato che il JSON viene recuperata: risultato

JSON

[{"title":"Event1","start":"2011-04-04"},{"title":"Event2","start":"2011-04-05"}] 

E questo funziona bene:

$(document).ready(function() { 
     $('#calendar').fullCalendar({ 
      events: [{title: 'Event1',start: '2011-04-04'}, 
        {title: 'Event2',start: '2011-04-05'} 
        ]}); 
    }); 

Ho provato con tutte le serie di formati di data (tra cui ISO8601 e * nix timestamp e ottenuto lo stesso risultato: nessun evento associato, solo un calendario vuoto.Se aggiungo un errore $ .ajax: function all'oggetto .fullCalendar, esso si attiva, quindi presumibilmente qualcosa viene restituito a Json - ma esso sembra a posto per me.

Sto usando FullCalendar 1.5 (anche se ho provato anche 1.4.11), JQuery 1.5.1, JQueryUI 1.8.11.

Ho provato tutto quello che riesco a pensare - tutte le idee sono molto apprezzate!

+0

Sono passato e ho trovato il problema: c'è un conflitto di nomi di funzioni con jquery.validate.js. –

risposta

3

Sono passato e ho trovato il problema: c'è una collisione di nomi di funzioni tra fullcalendar.js e jquery.validate.js.

+0

quale funzione? Potrebbe fornire maggiori dettagli per favore. – Gandarez

+0

No, non ricordo; questo era 30 mesi fa. Se è fondamentale, potresti eseguire alcune vecchie versioni? Ma il problema è stato risolto dalle versioni successive, quindi qual è il problema? –

0

Forse, invece di questo:

return Json(rows, JsonRequestBehavior.AllowGet); 

Try This:

return Json(rows.ToArray(), JsonRequestBehavior.AllowGet); 

O invece di questo:

events: '@Url.Content("~/Calendar/Events")' 

Prova questo:

events: '@Url.Action("Events", "Calendar")' 
+0

Grazie, ma il JSON viene restituito correttamente, quindi cambiare il modo in cui UrlHelper crea l'URL non fa la differenza. E il mio parametro rows è già un array. Il problema è sicuramente jquery.validate.js. –

1

Utilizzare il metodo $ .ajax().

azione (controllo Calendar)

public JsonResult Events(string start, string end) 
    { 
     //convert string to date 
     DateTime _start = DateTime.TryParse(start, out _start) ? _start : DateTime.Now.Date; 
     DateTime _end = DateTime.TryParse(end, out _end) ? _end : DateTime.Now.Date; 

     var rows = 
     new object[] { new { title="Event1", start= "2011-04-04" },          
     new { title="Event2", start= "2011-04-05" } }; 
     return Json(rows, JsonRequestBehavior.AllowGet); 
    } 

View

$(document).ready(function() { 
    $('#calendar').fullCalendar({ 

    events: function (start, end, callback) { 
     $.ajax({ 
      url: '@Url.Content("~/Calendar/Events")', 
      dataType: 'json', 
      data: { 
       start: start.toLocaleString("yyyy-mm-dd"), 
       end: end.toLocaleString("yyyy-mm-dd") 
      }, 

      success: function (doc) { 
       var events = []; 
       $.each(doc, function (key, val) { 
        events.push({ 
         title: val.title, 
         start: val.start, 
         url: 'http://google.com' 
        }); 
       }); 

       callback(events); 
      } 
     }); 
    } 
    }); 
    }) 

spera che questo vi aiuterà.

+0

No, il problema era sicuramente il nome collisione che abbiamo scoperto l'anno scorso. L'espansione della chiamata ajax non sarebbe stata di aiuto, ma l'utilizzo di una versione più recente di jquery.validate.js l'ha fatto. –

+0

Heh. Stavo avendo un problema simile. Tranne il tutorial che avevo seguito specificato dall'inizio e alla fine come doppio, non come stringhe. Ho notato che nel tuo codice erano stringhe e ho dato un colpo. Risulta che era corretto, e ora il mio codice GetEvents viene chiamato sul back-end. Pubblicando qui nel caso aiuti qualcun altro in futuro. –