2011-12-31 8 views
9

Quindi, praticamente tutto è nel titolo. Fondamentalmente, voglio inviare un JSON attraverso JQuery dal client ad asp.net MVC. Mi chiedo se è possibile che esso riceva (ma non necessariamente analizza) qualsiasi JSON da che voglio inviare dalla chiamata JQuery Ajax, indipendentemente dal suo tipo .. senza che io abbia una rappresentazione di tipo/modello concreta. (fondamentalmente come un tipo dinamico?)E 'possibile per un asp.net MVC "Metodo di azione" ricevere JSON senza dichiarare il suo tipo specifico sul parametro? Se é cosi, come?

Fare questo in modo normale (con me dichiarando l'argomento che passa come tipo Object) porta solo null, che era quello che mi aspettavo.

Fondamentalmente, voglio fare una sorta di "riflessione per JSON" roba tipo quando lo ricevo, ed essere in grado di ottenere le sue proprietà attraverso una sorta di ciclo foreach, ecc

Grazie in anticipo. Qualsiasi aiuto sarebbe grande!

+0

e riguardo la ricezione di un oggetto? potresti alternativamente non avere parametri e ispezionare richiesta ... – jcolebrand

+0

vuoi dire un oggetto JSON? come faresti a riguardo? Fondamentalmente, il mio obiettivo è vedere come MVC analizzerebbe l'oggetto JSON che sto inviando, e sarà in grado di ottenere in modo dinamico le sue proprietà e i suoi valori attraverso un ciclo foreach o qualcosa senza un tipo C# concreto per esso. –

+0

no intendo 'indice ActionResult pubblico (oggetto) {' riceve un oggetto. – jcolebrand

risposta

10

È possibile utilizzare un argomento IDictionary<string, object> come argomento. Basta scrivere un modello personalizzato legante che analizzare una richiesta di JSON in esso:

public class DictionaryModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase)) 
     { 
      return null; 
     } 

     controllerContext.HttpContext.Request.InputStream.Position = 0; 
     using (var reader = new StreamReader(controllerContext.HttpContext.Request.InputStream)) 
     { 
      var json = reader.ReadToEnd(); 
      if (string.IsNullOrEmpty(json)) 
      { 
       return null; 
      } 
      return new JavaScriptSerializer().DeserializeObject(json); 
     } 
    } 
} 

che sarà registrata in Application_Start:

ModelBinders.Binders.Add(typeof(IDictionary<string, object>), new DictionaryModelBinder()); 

allora si potrebbe avere la seguente azione di controllo:

[HttpPost] 
public ActionResult Foo(IDictionary<string, object> model) 
{ 
    return Json(model); 
} 

a cui puoi lanciare qualsiasi cosa:

var model = { 
    foo: { 
     bar: [ 1, 2, 3 ], 
     baz: 'some baz value' 
    } 
}; 

$.ajax({ 
    url: '@Url.Action("foo")', 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8', 
    data: JSON.stringify(model), 
    success: function (result) { 
     // TODO: process the results from the server 
    } 
}); 
+0

che sembra più complicato di quello che ho fatto in passato per la stessa cosa (computer diverso, non questo) – jcolebrand

+0

@jcolebrand, che cosa hai fatto in passato? –

+0

@DarinDimitrov: questo è fantastico. molte cose succedendo qui. grazie –

Problemi correlati