2012-08-22 18 views
5

Aşağıdaki rasgele JSON nesnesine sahibim (Alan adları değiştirilebilir).JSON Nesnesini MVC Denetleyicisine Bağımsız Değişken Olarak Geç

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

-

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

Ben sadece argüman olarak aynı alan adları ile JSON nesne gibi bir sınıf tanımlayabilirsiniz biliyorum Ama farklı olan keyfi JSON nesnesi kabul etmek benim denetleyici istiyorum alan adları

+0

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

+1

Vadim, bunu biliyordum ... Sorun şu ki, FormSollection, JSON ... –

cevap

6

benzeyecek kullanan MVC eylemine özel JSON nesnesi, daha sonra bu çözümü kullanabilirsiniz, bir çekicilik gibi çalışır.

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

bu çözümün gerçek yararı, kolayca orijinal türleri için nesneleri döküm bağımsız değişkenlerin her bir kombinasyon için ve bu yanında yeni bir sınıf tanımlamak için ihtiyaç kalmamasıdır.

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

ve kullanabileceğiniz:

yayınınız yöntemi artık sadece bu gibi herhangi bir argüman olmadığı için hatta GET ve POST eylem yöntemlerini birleştirebilirsiniz, Şimdi

GÜNCELLENDİ böyle bir yardımcı yöntem

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

İstemci ve sunucu arasındaki tüm iletişimleri güçlü bir şekilde yazmaktan kaçınmak için hoş bir çözüm değildir. – Dermot

1

aynı imzaya sahip bir ViewModel var ve argüman olarak bağlayıcı type.Model sonra

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 
} 

çalışacaktır Ve geçmek istiyorsanız sizin Eylem yöntemi

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

ayrıca 4

MVC kullanabilirsiniz işinizi kolaylaştırmak için
public JsonResult GetJson(Dictionary<string,string> param) 
{ 
    //do work 
} 
+1

param her zaman benim için boş bir nesnedir ... – jjxtra

İlgili konular