2013-05-20 11 views
5

Ho questo jquery che usa ajax nel tentativo di restituire un oggetto json, ma non sono un professionista in ajax, sebbene lo abbia usato prima con json, solo che stavo caricando un file json e non provavo a restituire una stringa da una pagina cshtml che interroga un database per informazioni (come sto facendo qui).

Ecco jQuery:

$.ajax({ 
    url: "/AJAX Pages/Compute_Calendar_Events.cshtml", 
    async: true, 
    type: "GET", 
    dataType: "json", 
    contentType: "application/json", 
    success: function (jsonObj) { 
     console.log("AJAX SUCCESS!"); 
    }, 
    error: function (jqXHR, textStatus, error) { 
     alert("NO AJAX!"); 
    } 
}); 

(Inoltre ho provato "application/json; charset = UTF-8" come contentType, ma cambia alcun comportamento).

Ecco la pagina cshtml che indico AJAX per:

@{ 
    Layout = ""; 

    if(IsAjax || 1==1) 
    { 
     string jsonString = "{\"events\":["; 
     string selectQueryString = "SELECT title, summary, eventDate FROM CalendarEvents ORDER BY eventDate ASC"; 
     var db = Database.Open("Content"); 
     foreach (var row in db.Query(selectQueryString)) 
     { 
      jsonString += "{"; 
      jsonString += "\"title\":" + Json.Encode(row.title) + ","; 
      jsonString += "\"dateNumber\":" + Json.Encode(row.eventDate.ToString().Substring(0, row.eventDate.ToString().IndexOf("/"))) + ","; 
      jsonString += "\"dateMonth\":" + Json.Encode(row.eventDate.ToString().Substring(row.eventDate.ToString().IndexOf("/") + 1, row.eventDate.ToString().LastIndexOf("/") - (row.eventDate.ToString().IndexOf("/") + 1))) + ","; 
      jsonString += "\"dateYear\":" + Json.Encode(row.eventDate.ToString().Substring(row.eventDate.ToString().LastIndexOf("/") + 1, 4)) + ","; 
      jsonString += "\"summary\":" + Json.Encode(row.summary); 
      jsonString += "},"; 
     } 
     jsonString = jsonString.TrimEnd(','); 
     jsonString += "]}"; 
     /*System.IO.File.Delete(Server.MapPath("~/TEST.txt")); 
     var outputFile = System.IO.File.AppendText(Server.MapPath("~/TEST.txt")); 
     outputFile.Write(jsonString); 
     outputFile.Close();*/ 
@*  *@@jsonString 
    } 
    else 
    { 
     Response.Redirect("~/"); 
    } 
} 

E 'molto importante notare un paio di cose:

  1. ottengo nessun errore sul lato server o codice di errore.
  2. Ho scritto l'output in un semplice file .txt per testare il contenuto e incollandolo in jsonLint (trovato qui: http://jsonlint.com/) sono stato facilmente in grado di determinare che questa è, effettivamente, una sintassi json valida.
  3. Ricevo sempre il messaggio di avviso che viene eseguito solo con l'opzione "error: function()" della chiamata $ .ajax.
  4. Non ricevo spazi bianchi né prima né dopo l'intero jsonString (non che ciò sia probabilmente importante).
  5. Sono in un ambiente WebMatrix, C#, asp.net-pagine web.
  6. miei unici due sospetti sono 1) il tipo di dati e/o contentType non è impostato correttamente, o 2) L'ultima volta che ho dovuto usare Ajax per JSON (puntando a un file .json effettivo) ho dovuto cambiare un'impostazione in "IIS Express" per consentire di ricevere dati da file JSON, tuttavia, ho pensato che fosse necessario solo se effettivamente si utilizzava ajax per analizzare un "file" JSON e non solo dati JSON. Inoltre, non importa dove guardo, non riesco a trovare più questa risorsa.
  7. Il textStatus e di errore dei valori dei parametri sono: textStatus: Errore ParserError: SyntaxError: imprevisto gettone &, ma questo non sembra gettare qualsiasi bandiere rosse nella mia mente, perché so che la sintassi JSON da sola estrae ok .

Grazie a tutti per tutto il vostro aiuto. Credo di aver trovato il problema (l'inaspettato token commerciale ha finalmente fatto accendere una lampadina nella mia testa). Ho aggiunto la risposta a questa pagina, nel caso in cui possa aiutare qualcun altro in futuro.

+0

L'errore indica che si è verificato un errore sul server, non nel browser. – Barmar

+0

E 'contentType' è irrilevante con' type: "GET" ', perché non c'è contenuto (' contentType' si riferisce ai valori del modulo, 'dataType 'si riferisce alla risposta). – Barmar

+0

È necessario utilizzare Json.Write per generare il JSON ,. Non dovresti costruirlo in questo modo: 'Json.Write (db.Query (selectQueryString), Response.Oputput)' –

risposta

1

Per me, il problema è il risultato di codifica HTML automatica del rasoio (trasformando così tanti personaggi nelle loro &...; equivalenti codificati HTML).

Quindi, anziché scrivere @jsonString, dovevo scrivere @Html.Raw(jsonString) ignorando così (come intendevo in origine) ogni ulteriore codifica che potesse deformare la sintassi di JSON.

Inoltre, non ho trovato necessario aggiungere la linea Response.AddHeader("Content-Type","application/json");, anche se sto usando $.ajax invece di $.getJSON

Ancora una volta, grazie a tutti per il vostro aiuto!

+0

Solo su una nota a margine, è possibile creare l'intera stringa in Razor anziché con concatenazione di stringhe. Sei già dentro un motore di template, potresti anche usarlo :) –

+0

@BenjaminGruenbaum Non ho idea di cosa tu stia parlando, LOL mi piacerebbe un esempio! – VoidKing

+0

@BenjaminGruenbaum In realtà, forse dovrei dire, non ho idea di come trarrebbe beneficio da questa alternativa. – VoidKing

2

Ho avuto un problema simile,

ho risolto per rubrica un colpo di testa nella parte superiore del file .cshtml in WebMatrix

@{ 
     Response.AddHeader("Content-Type","application/json"); 
} 

Un'altra cosa da controllare è che il vostro JSON passa la convalida Copia-Incolla il risultato JSON in un validatore JSON e assicurati che passi. (L'hai già fatto, mi piacerebbe che i futuri lettori di questa domanda vedessero questo).

Ecco il codice di esempio si può afferrare la vostra JSON con

$.getJSON("/AJAX Pages/Compute_Calendar_Events.cshtml").done(function(result){ 
    alert("Success!"); 
    console.log(result); 
}).fail(function(){ 
    alert("Error loading"); 
}); 
+0

Come ho detto, ho usato JSONLint per assicurarmi che la sintassi JSON fosse valida, e lo è. – VoidKing

+0

Sto provando la tua risposta ora. – VoidKing

+0

'$ .getJSON' assume automaticamente il tipo di contenuto JSON, non interessa l'intestazione. – Barmar

Problemi correlati