提问者:小点点

返回错误角度ajax请求从MVCwebAPI


我花了几天时间试图弄清楚如何将角度ajax请求的错误返回到web api。

在我的js Account tController中,我有一个登录方法:

$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;
}

问题是我抛出了一个新的HttpResponse seException,它会触发并且不会将任何内容返回给ajax。我该如何解决这个问题?


共2个答案

匿名用户

通常,在这种情况下,将触发错误处理程序。

.error(function () {
    alert("login failed");
}

这是您可以处理错误的地方。

在这种情况下,您可能还希望返回401 Un授权而不是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,因为它已经击中您的控制器,即使您的控制器代码抛出错误(在以后的过程中)。

因此,如果您想知道抛出了什么错误,我将在其中创建Account tResponse Dto,并在其中引入新的Error字段,如下所示:

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;
}