gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:47:51 28 4
gpt4 key购买 nike

我有一个更新用户首选项的 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);
}

关于c# - Web API 复杂参数属性全部为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24129919/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com