MVC ajax json post al metodo di azione del controller

Sto cercando di ottenere una chiamata JQuery AJAX a un metodo di azione del controller che contiene un object complesso come parametro. Ho letto molti blog e ho provato diverse tecniche apprese da questi. Il post chiave su cui ho costruito il mio miglior codice di tentativo (di seguito) è il post StackOverflow qui .

Voglio triggersre un post asincrono, invocato quando l’utente rimuove un campo [non un messaggio Salva modulo – come dimostrato in altri esempi che ho trovato].

La mia intenzione è:

  • Istanziare un object sul client [non il ViewModel che fornisce il tipo per la vista];
  • Compilare l’object con i dati di diversi campi nella vista;
  • Converti questo object in JSON;
  • Chiama il metodo di azione del controller utilizzando il metodo jQuery.Ajax, passando l’object JSON.

I risultati verranno restituiti come risultato JSON; e i dati verranno caricati nei campi nella vista in base ai risultati restituiti.

I problemi sono:

  • Se il metodo action viene attribuito all’attributo HttpPost, il metodo Action del controller non viene richiamato (anche se il tipo di chiamata AJAX è impostato su “POST”).
  • Se il metodo di azione viene attribuito con HttpGet, i valori delle proprietà del parametro sono nulli
  • Il metodo ReadObject genera l’errore: “Aspettando la ‘radice’ elemento ‘dal namespace’ ‘.. Incontrato’ None ‘con nome’ namespace ‘”.

Spero che qualcuno possa aiutare. Grazie. Codice sotto:

File js del client

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) }); 

Azione Filtro e class per il tipo associato al parametro del metodo Azione

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

Metodo di azione sul controller

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