我正在尝试在服务器端访问我的登录方法。 我使用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'
我做错了什么?
答案 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}"会工作得很好。