Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 从MVC web API返回角度ajax请求时出错_Asp.net Mvc_Angularjs_Asp.net Web Api - Fatal编程技术网

Asp.net mvc 从MVC web API返回角度ajax请求时出错

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;

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

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

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

哦,谢谢,这正是我想要的,我几乎要放弃了