我有一个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在所有这些类中都能工作…
对于Asp.Net WebAPI,这似乎是一个常见问题。 通常,空对象的原因是将json对象反序列化为C#对象。不幸的是,调试非常困难,因此很难找到问题所在。 我更喜欢只将完整的json作为对象发送,然后手动反序列化。至少通过这种方式,您会得到真正的错误而不是空值。 如果将方法签名更改为接受对象,请使用JsonConvert:
public HttpResponseMessage Post(Object model) { var jsonString = model.ToString(); PreferenceRequest result = JsonConvert.DeserializeObject<PreferenceRequest>(jsonString); }