在ASP.NET MVC 5中添加没有参数的属性路由

时间:2018-05-19 20:56:22

标签: c# asp.net-mvc asp.net-web-api asp.net-web-api-routing

我将API控制器操作定义为:

public async Task<IHttpActionResult> ChangePassword(string userId, string password)

我原来的计划是通过AJAX请求的userId属性而不是通过API网址传递passworddata

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操作。

将属性路由应用于控制器操作时,是否要求所有属性都包含在路由中?

1 个答案:

答案 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",