2012-08-22 5 views
5

Mam następujący arbitralny obiekt JSON (Nazwy pól mogą zostać zmienione).Przekaż obiekt JSON do kontrolera MVC jako argument

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

-

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

wiem, że mogę zdefiniować klasę podobnie jak obiekt JSON z tymi samymi nazwami pól jako argument, ale chciałbym mój kontroler przyjąć dowolny obiekt JSON z inna nazwy pól.

+0

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

+1

Vadim, wiedziałem, że to ... Problem polega na tym, że FormCollection nie akceptuje JSON ... –

Odpowiedz

6

Jeśli chcesz przekazać niestandardowy obiekt JSON do akcji MVC, wtedy możesz użyć tego rozwiązania, działa jak urok.

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

Prawdziwą zaletą tego rozwiązania jest to, że nie wymagają, aby zdefiniować nową klasę dla każdej kombinacji argumentów, a poza tym, że można łatwo rzucić swoje obiekty do ich oryginalnych typów.

AKTUALIZACJA

Teraz można nawet połączyć swoje metody GET i POST działania Ponieważ metoda post nie ma żadnego argumentu więcej właśnie tak:

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

i można użyć metoda pomocnika tak, aby ułatwić zadanie

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

Dobre rozwiązanie, aby uniknąć silnego wpisywania wszystkich komunikatów między klientem a serwerem. – Dermot

1

Czy ViewModel z tym samym podpisem i używać tego jako argumentu wiążące type.Model zadziała wtedy

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 
} 

A twój sposób działania będzie wyglądać

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

można również użyć w MVC 4

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

param jest dla mnie zawsze pustym obiektem ... – jjxtra