Asp.net mvc 从MVC web API返回角度ajax请求时出错
我花了几天时间试图弄清楚如何将错误返回到web api的angular ajax请求 在我的js AccountController中,我有一个登录方法:Asp.net mvc 从MVC web API返回角度ajax请求时出错,asp.net-mvc,angularjs,asp.net-web-api,Asp.net Mvc,Angularjs,Asp.net Web Api,我花了几天时间试图弄清楚如何将错误返回到web api的angular ajax请求 在我的js AccountController中,我有一个登录方法: $scope.Login = function () { AccountService.Login($scope.UserData.LoginName, $scope.UserData.Password).success(function (account) { $scope.UserData = account;
$scope.Login = function () {
AccountService.Login($scope.UserData.LoginName, $scope.UserData.Password).success(function (account) {
$scope.UserData = account;
}).error(function () {
console.log("failed");
});
};
在web api中,我有以下内容:
public Account Login(string loginName, string password)
{
var emptyAccount = new Account();
password = Encrypt(password);
var account = db.Accounts.FirstOrDefault(c=>c.Password == password && c.LoginName == loginName);
if (account == null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
acount.Password = "";
return account;
}
问题是我抛出了一个新的HttpResponseException,它启动后不会向ajax返回任何内容。我该如何解决这个问题 通常,在这种情况下,将触发错误处理程序
.error(function () {
alert("login failed");
}
这是您可以处理错误的地方
此外,在本例中,您可能希望返回401 Unauthorized
,而不是404。通常,在您可以优雅地处理异常的情况下,抛出异常被认为是不好的做法:
public HttpResponseMessage Login(string loginName, string password)
{
var emptyAccount = new Account();
password = Encrypt(password);
var account = db.Accounts.FirstOrDefault(c => c.Password == password && c.LoginName == loginName);
if (account == null)
{
return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "unauthorized");
}
acount.Password = "";
return Request.CreateResponse(HttpStatusCode.OK, account);
}
当您发送数据,并且数据命中服务器时,它将返回头200 OK,因为它已经命中您的控制器,即使您的控制器代码是抛出错误(在后面的过程中) 所以,如果您想知道抛出了什么错误,我将在其中创建AccountResponse Dto,并在其中引入新的错误字段,如下所示:
public class AccountResponse()
{
public Account account { get; set;}
public string ErrorMessage { get; set; }
}
然后在控制器上:
public AccountResponse Login(string loginName, string password)
{
var emptyAccount = new Account();
password = Encrypt(password);
var account = db.Accounts.FirstOrDefault(c=>c.Password == password && c.LoginName == loginName);
if (account == null)
{
return new AccountResponse(){ ErrorMessage = Response.ResponseCodes.something;
}
AccountResponse.account = account;
AccountResponse.account.Password = "";
return AccountResponse;
}
哦,谢谢,这正是我想要的,我几乎要放弃了