c# - Web API 复杂参数属性全部为空

我有一个更新用户首选项的 Web API 服务调用。不幸的是,当我从 jQuery ajax 调用中调用此 POST 方法时,请求参数对象的属性始终为 null(或默认值),而不是传入的属性。如果我使用 REST 客户端调用相同的确切方法(我使用 Postman) ,效果很好。我无法弄清楚我做错了什么,但我希望有人以前见过这个。这很简单......

这是我的请求对象:

public class PreferenceRequest
{
    [Required]
    public int UserId;

    public bool usePopups;
    public bool useTheme;
    public int recentCount;
    public string[] detailsSections;
}

这是我在 UserController 类中的 Controller 方法:

    public HttpResponseMessage Post([FromBody]PreferenceRequest request)
    {
        if (request.systemsUserId > 0)
        {
            TheRepository.UpdateUserPreferences(request.UserId, request.usePopups, request.useTheme,
                                         request.recentCount, request.detailsSections);

            return Request.CreateResponse(HttpStatusCode.OK, "Preferences Updated");                
        }
        else
        {
            return Request.CreateErrorResponse(HttpStatusCode.NotAcceptable, "You must provide User ID");
        }
    }

这是我的 ajax 调用:

var request = {
    UserId: userId,
    usePopups: usePopups,
    useTheme: useTheme,
    recentCount: recentCount,
    detailsSections: details
};

$.ajax({
    type: "POST",
    data: request,
    url: "http://localhost:1111/service/User",
    success: function (data) {
        return callback(data);
    },
    error: function (error, statusText) {
        return callback(error);
    }
});

我尝试将 dataType 和 contentType 设置为几个不同的东西(“json”、“application/json”等),但请求对象的属性始终为默认值或 null。因此,例如,如果我传入这个对象:

var request = {
  UserId: 58576,
  usePopups: false,
  useTheme: true,
  recentCount: 10,
  detailsSections: ['addresses', 'aliases', 'arrests', 'events', 'classifications', 'custody', 'identifiers', 'phone', 'remarks', 'watches']
}

我可以看到具有上述有效值的完全填充的请求对象。但是在Web API Controller 中,请求是有的,只是属性如下:

  UserId: 0,
  usePopups: false,
  useTheme: false,
  recentCount: 0,
  detailsSections: null

仅供引用 - 我没有为这个项目做任何 ASP.Net MVC 或 ASP.NET 页面,只是将 Web API 用作服务并使用 jQuery $.ajax 进行所有调用。

知道我在这里做错了什么吗?谢谢!

更新:我只想指出,我在同一个 Web API 项目中有很多方法在其他 Controller 中执行此操作完全相同,我正在调用完全相同的方式,它们完美无缺!我花了一个上午比较各种调用,方法或标题似乎没有任何区别,但它在这个特定方法上不起作用。

我也尝试切换到 Put 方法,但得到完全相同的结果 - 请求对象进入,但未填充正确的值。令人沮丧的是,我在这个项目中有大约 20 个 Controller 类,而 Posts 可以在所有这些类中工作......

最佳答案

这似乎是关于 Asp.Net WebAPI 的常见问题。
一般空对象的原因是json对象反序列化为C#对象。不幸的是,调试非常困难 - 因此很难找到您的问题所在。
我更喜欢将完整的 json 作为对象发送,然后手动反序列化。至少这样你会得到真正的错误而不是空值。
如果您更改方法签名以接受对象,则使用 JsonConvert:

public HttpResponseMessage Post(Object model)
        {
            var jsonString = model.ToString();
            PreferenceRequest result = JsonConvert.DeserializeObject<PreferenceRequest>(jsonString);
        }

https://stackoverflow.com/questions/24129919/

相关文章:

ruby-on-rails - rails : Render Json Status Problem

javascript - 脚本5009 : 'JSON' is undefined

json - PostgreSQL 嵌套 JSON 查询

json - 服务器响应在中途被切断

c# - 使用 Json.Net 以 dd/MM/yyyy 格式反序列化日期

c# - 反序列化客户端 AJAX JSON 日期

json - 可以引用 JSON 数字吗?

json - 使用一些已知和一些未知的字段名解码 JSON

java - 在java中查询一个JSONObject

json - 从动态 json 数据更新力有向图上的链接