wake-up-neo.com

MVC-Ajax-Json-Post-zu-Controller-Aktionsmethode

Ich versuche, einen Aufruf von JQuery AJAX an eine Controller-Action-Methode zu erhalten, die ein komplexes Objekt als Parameter enthält ..__ Ich habe viele Blogs gelesen und verschiedene Techniken aus diesen probiert. Der Schlüsselpfosten, auf dem ich meinen besten Versuchscode (unten) aufgebaut habe, ist der stackoverflow post here .

Ich möchte einen asynchronen Beitrag auslösen, der aufgerufen wird, wenn der Benutzer ein Feld abblättert [kein Formularsicherungsbeitrag - wie in anderen gefundenen Beispielen gezeigt]. 

Meine Absicht ist es:

  • Instanziieren eines Objekts auf dem Client [nicht das ViewModel, das den Typ für die View bereitstellt];
  • Füllen Sie das Objekt mit Daten aus mehreren Feldern in der Ansicht.
  • Konvertieren Sie dieses Objekt in JSON.
  • Rufen Sie die Controller-Aktionsmethode mit der jQuery.Ajax-Methode auf und übergeben Sie das JSON-Objekt.

Die Ergebnisse werden als JSON-Ergebnis zurückgegeben. und Daten werden abhängig von den zurückgegebenen Ergebnissen in Felder in der Ansicht geladen.

Die Probleme sind: 

  • Wenn die Aktionsmethode mit dem Attribut HttpPost zugeordnet wird, wird die Controller-Action-Methode nicht aufgerufen (obwohl der Aufruftyp AJAX auf "POST" gesetzt ist) .
  • Wenn die Aktionsmethode mit HttpGetattributiert ist, sind die Werte der Eigenschaften des Parameters NULL
  • Die ReadObject-Methode gibt den Fehler aus: "Element 'root' vom Namespace '' erwartet. '' None 'mit dem Namen' Namespace ''".

Hoffentlich kann jemand helfen. Vielen Dank. Code unten:

Client-JS-Datei

 var disputeKeyDataObj = {
     "InvoiceNumber": "" + $.trim(this.value) + "",
     "CustomerNumber": "" + $.trim($('#CustomerNumber').val()) + ""
  };

  var disputeKeyDataJSON = JSON.stringify(disputeHeadlineData);      

  $.ajax({
     url: "/cnr/GetDataForInvoiceNumber",
     type: "POST",
     data: disputeKeyDataJSON,
     dataType: 'json',
     contentType: "application/json; charset=utf-8",
     success: EnrichedDisputeKeyData(result)
  });


Action Filter und Klasse für den Typ, der dem Action-Methodenparameter zugeordnet ist. 

 [DataContract]  
 public class DisputeKeyData  
 {  
    [DataMember(Name = "InvoiceNumber")]  
    public string InvoiceNumber { get; set; }

    [DataMember(Name = "CustomerNumber")]
    public string CustomerNumber { get; set; }
 }  

Aktionsmethode auf dem Controller 

  //[HttpPost]
  [ObjectFilter(Param = "disputeKeyData", RootType = typeof(DisputeKeyData))]  
  public ActionResult GetDataForInvoiceNumber(DisputeKeyData disputeKeyData)  
  {  
     //Blah!  
     //....  
     return Json(disputeKeyData, JsonRequestBehavior.AllowGet);  
  }  
32
Grant Sutcliffe

Nachfolgend ist beschrieben, wie ich das funktioniert habe. 

Der Schlüsselpunkt war: Ich musste das ViewModel verwenden, das der Ansicht zugeordnet ist, damit die Laufzeit das Objekt in der Anforderung auflösen kann. 

[Ich weiß, dass es eine Möglichkeit gibt, ein anderes Objekt als das standardmäßige ViewModel-Objekt zu binden, aber am Ende einfach die erforderlichen Eigenschaften für meine Anforderungen auffüllt, da ich es nicht zum Laufen bringen konnte.]

[HttpPost]  
  public ActionResult GetDataForInvoiceNumber(MyViewModel myViewModel)  
  {            
     var invoiceNumberQueryResult = _viewModelBuilder.HydrateMyViewModelGivenInvoiceDetail(myViewModel.InvoiceNumber, myViewModel.SelectedCompanyCode);
     return Json(invoiceNumberQueryResult, JsonRequestBehavior.DenyGet);
  }

Das JQuery-Skript, das zum Aufrufen dieser Aktionsmethode verwendet wurde:

var requestData = {
         InvoiceNumber: $.trim(this.value),
         SelectedCompanyCode: $.trim($('#SelectedCompanyCode').val())
      };


      $.ajax({
         url: '/en/myController/GetDataForInvoiceNumber',
         type: 'POST',
         data: JSON.stringify(requestData),
         dataType: 'json',
         contentType: 'application/json; charset=utf-8',
         error: function (xhr) {
            alert('Error: ' + xhr.statusText);
         },
         success: function (result) {
            CheckIfInvoiceFound(result);
         },
         async: true,
         processData: false
      });
35
Grant Sutcliffe

Dieser Blogbeitrag spricht direkt Ihr Problem an.

Es verwendet eine Technik ohne zusätzliche JSON-Clientbibliotheken. Es führt ein wirklich einfaches jQuery-Plugin ein, das Ihnen den Trick erleichtern wird.

4
Robert Koritnik

Welche Version von asp.net mvc verwenden Sie? Das Buchen von Json-Objekten in stark typisierten Controller-Aktionen wurde gerade in ASP.NET MVC 3 Beta 1 hinzugefügt. Dieser -Artikel beschreibt eine Problemumgehung unter Verwendung von Modellbindern für asp.net mvc 2 und Informationen zur Funktionsweise in MVC 3.

0
bkaid