MVC WebApi HttpGet具有复杂的对象

Dan*_*itz 7 asp.net json.net deserialization asp.net-web-api

我有一个现有的WebApi动作,我想从HttpPost切换到HttpGet.它目前需要一个复杂的对象作为参数.

该模型:

public class BarRequest
{
    [JsonProperty("catid")]
    public int CategoryId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制器:

public class FooController : ApiController
{
    //[HttpPost]
    [HttpGet]
    [ActionName("bar")]
    public void Bar([FromUri] BarRequest request)
    {
        if (request != null)
        {
            // CategoryId should be 123, not 0
            Debug.WriteLine("Category ID :: {0}", request.CategoryId);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在当我发送以下请求时,一切都按预期工作.

GET /foo/bar?CategoryId=123
Run Code Online (Sandbox Code Playgroud)

旧的POST请求也按预期工作.

POST /foo/bar {"catid":123}
Run Code Online (Sandbox Code Playgroud)

但现在我需要以下请求才能工作:

GET /foo/bar?catid=123
Run Code Online (Sandbox Code Playgroud)

我怎么能做到这一点?

Dan*_*itz 11

感谢您的建议,但唯一对我有用的解决方案如下.

之前:

var data = {
    catid: 123,
    // <snip>
};
var json = JSON.stringify(data);
$.post('/foo/bar', json, callback);
Run Code Online (Sandbox Code Playgroud)
public class FooController : ApiController
{
    [HttpPost, ActionName("bar")]
    public void Bar(BarRequest request)
    {
        // use request.Category to process request
    }
}
Run Code Online (Sandbox Code Playgroud)

后:

var data = {
    catid: 123,
    // <snip>
};
var json = JSON.stringify(data);
$.get('/foo/bar?data=' + encodeURIComponent(json), callback);
Run Code Online (Sandbox Code Playgroud)
public class FooController : ApiController
{
    [HttpGet, ActionName("bar")]
    public void Bar(string data)
    {
        var request = JsonConvert.DeserializeObject<BarRequest>(data);
        // use request.Category to process request
    }
}
Run Code Online (Sandbox Code Playgroud)

这样我就不需要在客户端或服务器上触摸任何模型,验证器等.此外,每个其他解决方案都要求我在服务器或客户端更改命名约定.