2012-08-22 35 views
5

Tengo el siguiente objeto JSON arbitrario (los nombres de los campos pueden cambiarse).Pase el objeto JSON al controlador MVC como argumento

{ 
    firstname: "Ted", 
    lastname: "Smith", 
    age: 34, 
    married : true 
    } 

-

public JsonResult GetData(??????????){ 
. 
. 
. 
} 

Sé que puedo definir una clase al igual que el objeto JSON con los mismos nombres de campo como el argumento, pero me gustaría que mi controlador de aceptar objeto JSON arbitraria con diferentes nombres de campo.

+0

Comprobar [esto] (http://stackoverflow.com/questions/5022958/passing-dynamic-json-object-to-c-sharp-mvc-controller) pregunta – vadim

+1

Vadim, sabía que esto ... El problema es que FormCollection no acepta el JSON ... –

Respuesta

6

Si desea pasar objeto JSON personalizado para la acción MVC, entonces puedes usar esta solución, funciona como un amuleto.

public string GetData() 
    { 
     // InputStream contains the JSON object you've sent 
     String jsonString = new StreamReader(this.Request.InputStream).ReadToEnd(); 

     // Deserialize it to a dictionary 
     var dic = 
      Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<String, dynamic>>(jsonString); 

     string result = ""; 

     result += dic["firstname"] + dic["lastname"]; 

     // You can even cast your object to their original type because of 'dynamic' keyword 
     result += ", Age: " + (int)dic["age"]; 

     if ((bool)dic["married"]) 
      result += ", Married"; 


     return result; 
    } 

El beneficio real de esta solución es que no se requiere definir una nueva clase para cada combinación de argumentos y al lado de eso, puede emitir sus objetos a sus tipos originales fácilmente.

ACTUALIZADO

Ahora, incluso se puede fusionar su GET y POST de métodos de acción ya que su método post no tiene ningún argumento más como este:

public ActionResult GetData() 
{ 
    // GET method 
    if (Request.HttpMethod.ToString().Equals("GET")) 
     return View(); 

    // POST method 
    . 
    . 
    . 

    var dic = GetDic(Request); 
    . 
    . 
    String result = dic["fname"]; 

    return Content(result); 
} 

y se puede utilizar un método de ayuda como este para facilitar su trabajo

public static Dictionary<string, dynamic> GetDic(HttpRequestBase request) 
{ 
    String jsonString = new StreamReader(request.InputStream).ReadToEnd(); 
    return Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(jsonString); 
} 
+1

Buena solución para evitar escribir fuertemente todas las comunicaciones entre el cliente y el servidor. – Dermot

1

Tener un modelo de vista con la misma firma y usar eso como argumento vinculante type.Model trabajará entonces

public class Customer 
{ 
    public string firstname { set;get;} 
    public string lastname { set;get;} 
    public int age{ set;get;} 
    public string location{ set;get;} 
    //other relevant proeprties also 
} 

Y su método de acción se verá como

public JsonResult GetData(Customer customer) 
{ 
    //check customer object properties now. 
} 
0

también puede utilizar esto en MVC 4

public JsonResult GetJson(Dictionary<string,string> param) 
{ 
    //do work 
} 
+1

param es siempre un objeto vacío para mí ... – jjxtra

Cuestiones relacionadas