我已经用jQuery编写针对ASP.NET Web API的代码了一段时间,我在Angular中开始了一些新的东西(针对相同的Web API后端编写.)
我正在发布一个方法,该方法将返回系统中实体的一些搜索结果.它看起来像这样:
public IEnumerable<dynamic> Post(string entity, FormDataCollection parameters)
{
// entity is passed on the route.
// parameters contains all the stuff I'm trying to get here.
}
Run Code Online (Sandbox Code Playgroud)
如果我使用jQuery.post调用该方法:
$.post('api/search/child', {where : 'ParentID = 1'}, function(d){ foo = d });
Run Code Online (Sandbox Code Playgroud)
它运作正常,并返回我期望的.
我在我的角度应用程序中提供了一个类似的调用服务:
$http.post('api/search/child', { where: 'parentID = ' + parent.ID })
.success(function (data, status, headers, config) {
// etc.
})
Run Code Online (Sandbox Code Playgroud)
但是当它在服务器上点击我的"Post"方法时,"paramters"为空.
经过一些谷歌搜索后,我尝试添加一个内容类型的标题,以确保它作为JSON传递,并尝试JSON.stringify-ing和$ .param() - "数据"参数,但没有做任何事情(和从我所读到的那些不应该是必要的.)我在这里做错了什么?谢谢你的帮助!
更新:这是来自(工作)jQuery示例的原始请求:
POST http://localhost:51383/api/search/child HTTP/1.1
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: …Run Code Online (Sandbox Code Playgroud) 我正在使用 ASP.NET Core MVC 2.0 实现一个 REST API 项目,如果模型绑定失败(因为请求语法错误),我想返回 400 状态代码,如果模型验证失败,我想返回 422 状态代码(因为该请求在语法上是正确的,但包含不可接受的值)。
例如,给定一个动作,如
[HttpPut("{id}")]
public async Task<IActionResult> UpdateAsync(
[FromRoute] int id,
[FromBody] ThingModel model)
Run Code Online (Sandbox Code Playgroud)
当id路由中的参数包含非数字字符或请求中未指定正文时,我想返回 400 状态代码,当属性ThingModel包含无效值时返回 422 状态代码。
从我所看到的情况来看,IValueProvider和IModelBinder实现都ModelStateDictionary像验证器一样将它们的错误添加到请求中,并且无法在绑定和验证之间注入代码。
我怎样才能实现这样的行为?
我有这堂课
[Serializable]
public class MyObject {
// properties omitted
}
Run Code Online (Sandbox Code Playgroud)
以及此WebAPI控制器方法:
[HttpPost]
[ResponseType(typeof(string))]
public IHttpActionResult SetMyObject(MyObject o) {
// process object
}
Run Code Online (Sandbox Code Playgroud)
但是它无法建模绑定到MyObject类。控制器方法中的对象o完全为空,每个属性均为默认值(因此通常为null)。
事实证明,这是由于MyObject上的[Serializable]注释所致。删除后,模型绑定将再次起作用。
有没有办法保持[可序列化]并修复模型绑定?