2009-04-13 9 views
2

Ich habe eine Suchseite, bei der der obere Rand der Seite Suchkriterien mit einer Suchschaltfläche ist. Am unteren Bildschirmrand werden die Ergebnisse angezeigt, wenn die Suchtaste gedrückt wird. In diesem Fall habe ich 6 verschiedene Suchkriterien, die der Benutzer eingeben kann. Ich möchte alle Kriterien in einer Klasse bündeln, damit meine Controller-Aktion das Json-Objekt als Klasse lesen kann. Mit FireBug kann ich sehen, dass mein Json korrekt erstellt wurde. Mit dem Debugger weiß ich, dass mein Controller/Action ausgelöst wird. Wenn ich jedoch das Klassenobjekt mit dem Debugger in der Steuerung/Aktion betrachte, sind alle Eigenschaften null oder null.JQuery mit Json zu rufen Controller/Aktion

Hier ist mein Controller .... [AcceptVerbs (HttpVerbs.Post)] public Action GetStudentByCritera (StudentSearchCriteraCV critera) { // Die Daten Viewdata [ "MAINDATA"] = studentBLLHdl.StudentFind (critera); return Ansicht(); }

Hier ist die JavaScript/JQuery, die den Controller ruft ... Funktion LoadResultTable() { // bauen Json Objekt var dataToSend = BuildJson()

 $.ajax({ 
      url: "GetStudentByCritera", 
      type: 'POST', 
      data: dataToSend, 
      dataType: 'json', 
      contentType: "application/json; charset=utf-8", 
      beforeSend: ClientSideValidate, 
      success: function(result) 
      { 
       alert(result.Result); 
       $('#SearchResult').html(result.Result).show(); 
       // UnBlock UI 
      }, 
      error: function (XMLHttpRequest, textStatus, errorThrown) 
      { 
       // UnBlock UI 

       // not sure how to handel error 
       alert("error happen when posting to 'GetStudentByCritera'") 

       // typically only one of textStatus or errorThrown 
       // will have info 
       this; // the options for this ajax request 
      } 


     }); 
    } 

    function BuildJson() 
    { 
     // building Json    

     var dataForClass = { "StudentSearchCriteraCV" : [{ 
      "StudLname": $("input[name='StudentSearchCriteraCV.StudLname']").val(), 
      "StudFname": $("input[name='StudentSearchCriteraCV.StudFname']").val(), 
      "Ssn": $("input[name='StudentSearchCriteraCV.Ssn']").val(), 
      "StudId": $("input[name='StudentSearchCriteraCV.StudId']").val(), 
      "Sex": $("input[name='StudentSearchCriteraCV.Sex']").val(), 
      "Race": $("input[name='StudentSearchCriteraCV.Race']").val() 
      }]}; 

     return $.toJSON(dataForClass); 
    } 

    function ClientSideValidate() 
    { 
     // Block the UI 
     alert("In the ClientSideValidate"); 

     // if error UNBlock UI 
     // return true if client side data is good. 

     return true; 
    } 


</script> 

Antwort

0

Ich glaube, dass Ihr JSON-Wert in Anführungszeichen gesetzt werden muss, es sei denn, es handelt sich um eine Zahl.

"StudFname": '"' + $("input[name='StudentSearchCriteraCV.StudFname']").val() + '"', 

Ich habe nicht verwendet .toJSON(), aber ich glaube, dass es Ihr JSON-Objekt in einen String verwandelt. Da Sie Ihr Objekt erstellen, nur um es sofort zu einem String zu machen, warum erstellen Sie es nicht zu Beginn als String? Das ist, was ich tat, als ich in dieses Problem lief (Debugger Nullen für Werte. Zeigt)

var dataForClass = '{ "StudentSearchCriteraCV" : [{ ' + 
     '"StudLname": "' + $("input[name='StudentSearchCriteraCV.StudLname']").val() + '", ' + 
     '"StudFname": "' + $("input[name='StudentSearchCriteraCV.StudFname']").val() + '", ' + 
     '"Ssn": "' + $("input[name='StudentSearchCriteraCV.Ssn']").val() + '", ' + 
     '"StudId": ' + $("input[name='StudentSearchCriteraCV.StudId']").val() + ', ' + //assuming StudID is a number 
     '"Sex": "' + $("input[name='StudentSearchCriteraCV.Sex']").val() + '", ' + 
     '"Race": "' + $("input[name='StudentSearchCriteraCV.Race']").val() +'" ' + 
     '}]}'; 
3

Ihr Ajax-Aufruf ist nur eine asynchrone HTTP-Post, damit die Daten Paramter nur Schlüssel-Wert-Paare sein kann, kein JSON-Objekt . Wenn Sie DataForClass reduzieren, wird es funktionieren.