使用方法POST时无法访问actionresult

时间:2016-03-03 16:09:06

标签: jquery ajax asp.net-mvc asp.net-web-api

我正在尝试在服务器端访问我的登录方法。 我使用ajax调用来执行此操作,但是当我使用帖子执行此操作时它不起作用。

代码:

$(".getToken").on("click", function () {
    $.ajax({
        url: "api/Login",
        type: 'POST',
        data: { username: "myusername", password : "mypass!" },
        contentType: 'application/json; charset=utf-8',
        success: function (data) {
           //logic
        },
        error: function (event, jqxhr, settings, thrownError) {
            var h;

        }
    });
})

服务器:

[AllowAnonymous, HttpPost, Route("api/Login")]
public IHttpActionResult Login(string username, string password)
{ // some logic}

Routconfig:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

routes.MapRoute(
    name: "Login",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Login", action = "Login", userName = UrlParameter.Optional, password = UrlParameter.Optional }
);

当我从POST更改为GET时,它工作正常。 错误讯息:

  

找不到与请求URI匹配的HTTP资源   ' http://localhost:64251/api/Login'

我做错了什么?

1 个答案:

答案 0 :(得分:2)

不是将参数作为字符串传递,而是创建一个代表它们的模型并传递它。

public class UserLoginModel {
    public string UserName {get;set;}
    public string Password {get;set;}
}

您的javascript提供的数据必须与该模型完全匹配,因此需要UserName属性和Password属性。然后,您可以将操作的签名更改为

public IHttpActionResult Login(UserLoginModel login)

我不相信.net MVC路由本身解析来自请求主体的字符串以分隔参数。如果为它提供了一个对象,它可以轻松地将json反序列化为特定类型。

此外,您不需要按照自己的方式配置多条路线。一个具有模式的路线" {controller} / {action} / {id}"会工作得很好。