我有一个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);
}
当我尝试发送请求时“http://localhost:1234/api/case/create?signature=123456“从Postman(谷歌扩展)使用body请求中的“表单数据”,我得到错误: “消息”:“此资源不支持请求实体的媒体类型‘多部分/表单数据’。”,“ExceptionMessage”:“没有MediaTypeFormatter可用于从媒体类型为“multipart/for
函数可以处理传递给它的参数,并且能返回它的退出状态码给脚本,以便后续处理。 function_name $arg1 $arg2 函数通过位置来引用传递过来的参数(就好像它们是位置参数),例如,$1, $2,等等。 例子 24-2. 带参数的函数 #!/bin/bash # 函数和参数 DEFAULT=default # 默认参数值。D func2 () {
我试图通过web api microsoft应用程序中的post请求传递对象的参数,但传递的参数始终为null。 这是我的控制器的post方法,在调试下程序达到了方法但是dataUrlIN。url字符串始终为空 这是DataUrl的对象 这是post请求的最新版本 在发送post请求后,方法公共无效Post(Data Url dataUrlIN)中的断点被触发,但url字符串为空HelloWorl
属性参数用来给已定义的属性附加元数据,类似于脚本语言的 Decorator 或者 C# 的 Attribute。 属性检查器相关参数 参数名 说明 类型 默认值 备注 type 限定属性的数据类型 (Any) undefined 详见 type 参数 visible 在 属性检视器 面板中显示或隐藏 boolean (注1) 详见 visible 参数 displayName 在 属性检视器 面板
属性参数用来给已定义的属性附加元数据,类似于脚本语言的 Decorator 或者 C# 的 Attribute。 属性检查器相关参数 参数名 说明 类型 默认值 备注 type 限定属性的数据类型 (Any) undefined 详见 type 参数 visible 在 属性检视器 面板中显示或隐藏 boolean (注1) 详见 visible 参数 displayName 在 属性检视器 面板
属性 属性(Attribute)是一种通用的用于表达元数据的特性,借鉴ECMA-334(C#)的语法来实现ECMA-335中描述的Attributes。属性只能应用于Item(元素、项), 例如 use 声明、模块、函数等。 元素 在Rust中,Item是Crate(库)的一个组成部分。它包括 extern crate声明 use声明 模块(模块是一个Item的容器) 函数 type定义 结构体定