Web API复杂和一个动作中的原始参数

时间:2013-10-07 20:12:19

标签: c# asp.net-web-api

我有一个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数据或更改我的操作方法来解决此问题?

2 个答案:

答案 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中。