小编典典

Web API复杂参数属性全为空

ajax

我有一个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类中的控制器方法:

    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控制器中,请求在那里,但是属性如下:

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

仅供参考-我不会在此项目中使用任何ASP.Net MVC或ASP.NET页面,仅使用Web API作为服务并使用jQuery $ .ajax进行所有调用。

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

更新: 我只想指出,在其他控制器的同一Web API项目中,我有许多方法可以执行 完全相同的操作 ,并且我以 完全相同的方式
调用,并且它们可以完美地工作!我已经花了一个上午比较各种调用,而且方法或标题似乎没有任何区别,但是在此特定方法上却不起作用。

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


阅读 338

收藏
2020-07-26

共1个答案

小编典典

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

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