我有一个ASP.NET Web API操作:
[HttpPost]
public void test(myCustomObj Entity)
{
}
JSON数据是:
{
"ID": "1",
"Name": "ilhan",
"surname": "aksu"
}
到目前为止,我的代码效果很好。但是,当我添加一个新的原始参数时:
[HttpPost]
public void test(myCustomObj Entity, [FromBody] string strdata)
{
}
当我发布以下JSON时:
{
"Entity": {
"ID": "1",
"Name": "ilhan",
"surname": "aksu"
},
"strdata": "testdata"
}
服务器返回 500内部服务器错误。
如何格式化我的JSON数据或更改我的操作方法来解决此问题?
答案 0 :(得分:2)
如果您发布了json,则可以接受string
参数:
[HttpPost]
public void Test(string jsonString)
{
}
也许是一个序列化器助手,以避免污染代码:
public static class JsonSerializer
{
public static string Serialize<T>(T t) where T : class
{
return JsonConvert.SerializeObject(t);
}
public static T Deserialize<T>(string s) where T : class
{
return (T)JsonConvert.DeserializeObject(s, typeof(T));
}
}
然后在您的方法中,您可以实现json有效负载:
[HttpPost]
public void Test(string jsonString)
{
var o = JsonSerializer.DeserializeObject(jsonString, typeof(MyObject));
// ...
}
如果你要回json,可能如下:
[HttpGet]
public JsonResult GetTest()
{
var i = YourService.GetSomethingById(1);
iSerialized = JsonSerializer.Serialize(i);
return new JsonResult
{
ContentEncoding = System.Text.Encoding.UTF8,
ContentType = "application/json",
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
Data = iSerialized
};
}
答案 1 :(得分:0)
一如既往地写一个视图模型
public class MyViewModel : myCustomObj
{
public string Strdata { get; set; }
}
现在让您的控制器操作将此视图模型作为参数:
[HttpPost]
public void test(MyViewModel model)
{
...
}
现在您可以使用以下JSON有效负载执行操作:
{"ID":"1","Name":"ilhan","surname":"aksu","strdata":"testdata"}
并且一切都会得到适当的约束。
或者,您的视图模型可能如下所示:
public class MyViewModel
{
public myCustomObj Entity { get; set; }
public string Strdata { get; set; }
}
现在您可以使用此有效负载执行操作:
{"Entity":{"ID":"1","Name":"ilhan","surname":"aksu"},"strdata":"testdata"}
因此,根据您要用来调用控制器操作的JSON有效负载,决定视图模型的外观基本取决于您。所以,永远不要想到在控制器动作中有多个动作参数。始终考虑视图模型的外观。
是的,控制器操作始终将视图模型作为参数,并始终返回视图模型。这是正确的设计。在ASP.NET MVC和ASP.NET Web API中。