2

我有一个 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 Internal Server Error

如何格式化我的 JSON 数据或更改我的操作方法来解决这个问题?

4

2 回答 2

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
        };
}
于 2013-10-07T20:29:56.547 回答
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 有效负载,您基本上可以决定视图模型的外观。因此,永远不要考虑在控制器动作中拥有超过 1 个动作参数。始终考虑您的视图模型的外观。

是的,控制器动作总是将视图模型作为参数并总是返回视图模型。这才是正确的设计。在 ASP.NET MVC 和 ASP.NET Web API 中。

于 2013-10-07T20:14:31.093 回答