Передача объекта JSON в контроллер MVC в качестве аргумента
У меня есть следующий произвольный объект JSON (имена полей могут быть изменены).
{
firstname: "Ted",
lastname: "Smith",
age: 34,
married : true
}
-
public JsonResult GetData(??????????){
.
.
.
}
Я знаю, что могу определить класс точно так же, как объект JSON с теми же именами полей, что и аргумент, но я бы хотел, чтобы мой контроллер принимал произвольный объект JSON с разными именами полей.
3 ответа
Если вы хотите передать пользовательский объект 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);
}
Имейте ViewModel с той же подписью и используйте его в качестве аргумента type.Model будет работать тогда
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
}
И ваш метод действий будет выглядеть
public JsonResult GetData(Customer customer)
{
//check customer object properties now.
}
Вы также можете использовать это в MVC 4
public JsonResult GetJson(Dictionary<string,string> param)
{
//do work
}