我将API控制器操作定义为:
public async Task<IHttpActionResult> ChangePassword(string userId, string password)
我原来的计划是通过AJAX请求的userId
属性而不是通过API网址传递password
和data
。
E.g:
$.ajax({
url: "/api/users/resetpassword",
data: JSON.stringify({
"userId" : userId,
"password" : password
}),
dataType: "json",
method: "POST",
success: function () {
$("#ResetPasswordModal").modal('toggle');
toastr.success("Password Reset");
},
error: function () {
$("#ResetPasswordModal").modal('toggle');
toastr.error("Password could not be reset");
}
});
但是,如果我应用属性路由[Route("api/users/resetpassword")]
我收到错误
未在控制器上找到任何操作&#39;用户&#39;与请求匹配
如果我然后用[Route("api/users/{userId}/resetpassword/{password}")]
替换属性路由,则应用程序可以成功找到ChangePassword
操作。
将属性路由应用于控制器操作时,是否要求所有属性都包含在路由中?
答案 0 :(得分:1)
创建一个模型来保存从客户端发送的数据
public class ChangePasswordModel {
public string userId { get; set; }
public string password { get; set; }
}
更新操作以期望请求正文中的数据
public class UsersController: ApiController {
//...
//POST api/users/resetpassword
[HttpPost]
[Route("api/users/resetpassword")]
public async Task<IHttpActionResult> ChangePassword([FromBody]ChangePasswordModel data) {
//...
}
//...
}
这假设已在WebApiConfig
中启用了属性路由。
config.MapHttpAttributeRoutes();
基于以下客户详细信息
url: "/api/users/resetpassword",
data: JSON.stringify({
"userId" : userId,
"password" : password
}),
dataType: "json",
method: "POST",