我有以下任意JSON对象(字段名称可能会更改)。
{
firstname: "Ted",
lastname: "Smith",
age: 34,
married : true
}
-
public JsonResult GetData(??????????){
.
.
.
}
我知道我可以像JSON对象一样定义一个具有与参数相同的字段名称的类,但我希望我的控制器接受具有不同字段名称的任意JSON对象。
答案 0 :(得分:6)
如果您想将自定义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);
}
答案 1 :(得分:1)
拥有一个具有相同签名的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.
}
答案 2 :(得分:0)
你也可以在MVC 4中使用它
public JsonResult GetJson(Dictionary<string,string> param)
{
//do work
}