asp.net - 具有复杂对象的MVC WebApi HttpGet

标签 asp.net asp.net-web-api deserialization json.net

我有一个现有的 WebApi 操作,我想从 HttpPost 切换到 HttpGet。它目前采用单个复杂对象作为参数。

型号:

public class BarRequest
{
    [JsonProperty("catid")]
    public int CategoryId { get; set; }
}

Controller :
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);
        }
    }
}

现在,当我发送以下请求时,一切都按预期进行。
GET /foo/bar?CategoryId=123

旧的 POST 请求也按预期工作。
POST /foo/bar {"catid":123}

但现在我需要以下请求才能工作:
GET /foo/bar?catid=123

我怎样才能做到这一点?

最佳答案

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

之前:

var data = {
    catid: 123,
    // <snip>
};
var json = JSON.stringify(data);
$.post('/foo/bar', json, callback);

public class FooController : ApiController
{
    [HttpPost, ActionName("bar")]
    public void Bar(BarRequest request)
    {
        // use request.Category to process request
    }
}

之后:
var data = {
    catid: 123,
    // <snip>
};
var json = JSON.stringify(data);
$.get('/foo/bar?data=' + encodeURIComponent(json), callback);

public class FooController : ApiController
{
    [HttpGet, ActionName("bar")]
    public void Bar(string data)
    {
        var request = JsonConvert.DeserializeObject<BarRequest>(data);
        // use request.Category to process request
    }
}

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

关于asp.net - 具有复杂对象的MVC WebApi HttpGet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15622852/

相关文章:

Java序列化

asp.net - UpdatePanel 只刷新一次

c# - Web.Config 中文件的 ASP.NET 相对路径

c# - 服务器端代码在当前线程忙时将数据推送到客户端浏览器 cometd (编程)

c# - 从后面的代码调用 jquery

c# - OWIN 自托管中的 Nancy 和 WebAPI 路由冲突

c# - Web API POST MultipartFormDataContent : Can response return multipartform content?

c# - 从 Fiddler 发布到 ASP.NET Web API

java - 想要使用 arraylist 将 json 字符串反序列化为 java 对象

json - Jackson 反序列化 ... 意外 token (END_OBJECT),