Передайте объект JSON в MVC-контроллер как аргумент

У меня есть следующий произвольный объект JSON (имена полей могут быть изменены).

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

-

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

Я знаю, что могу определить класс, как объект JSON, с теми же именами полей, что и аргумент. Но я бы хотел, чтобы мой контроллер принял произвольный объект JSON с разными именами полей.

Ответ 1

Если вы хотите передать пользовательский объект JSON в действие MVC, вы можете использовать это решение, оно работает как шарм.

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

Настоящая выгода от этого решения заключается в том, что вам не требуется определять новый класс для каждой комбинации аргументов, а кроме того, вы можете легко добавлять объекты к их оригинальным типам.

ОБНОВЛЕНО

Теперь вы можете объединить свои методы GET и POST, поскольку ваш метод post больше не имеет никаких аргументов:

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

и вы можете использовать вспомогательный метод, подобный этому, чтобы облегчить вашу работу.

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

Ответ 2

Имейте ViewModel с той же сигнатурой и используйте это как тип аргумента. Связывание модов будет работать тогда

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
}

И ваш метод Action будет выглядеть как

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

Ответ 3

вы также можете использовать это в MVC 4

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