angular.js http发布到MVC异步任务<actionresult> web方法失败

时间:2016-02-18 08:54:00

标签: angularjs model-view-controller asynchronous controller

我试图从角度客户端调用MVC控制器(示例登录)中的Async方法,并且调用失败。我也尝试使用google postman工具。

    //
    // POST: /Account/Login
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, change to shouldLockout: true
        var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:
                return RedirectToLocal(returnUrl);
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
            case SignInStatus.Failure:
            default:
                ModelState.AddModelError("", "Invalid login attempt.");
                return View(model);
        }
    }

以下是调用Login方法的角度服务的片段

&#13;
&#13;
        var loginUser = function (email, password, returnUrl) {
            var req = {
                method: 'post',
                url: '/Mysite/Login',
                headers: {
                    'Content-Yype': undefined
                },
                data: {
                    model: {
                        Email: email,
                        Password: password,
                        RememberMe: false
                    },
                    returnUrl: returnUrl
                }
            };
            return $http(req)
                .then(function (response) {
                    return response.data;
                }, function (reason) {
                    return reason;
                });
        };
&#13;
&#13;
&#13;

响应会引发状态为500的内部错误。

angular.js是否支持对Web方法的异步调用?

感谢并感谢您的帮助

1 个答案:

答案 0 :(得分:0)

如果您使用[ValidateAntiForgeryToken]装饰器,则该操作需要在后期数据中传递请求验证令牌。

您可以删除[ValidateAntiForgeryToken],但这会使您的操作对被篡改的请求开放。

另一种选择是向页面添加防伪标记,然后在请求中传递其值。

您的剃刀视图需要一个带有令牌的表单(注意:这只是一个虚拟表单,允许将令牌添加到页面中)。

        var loginUser = function (email, password, returnUrl) {
            var req = {
                method: 'post',
                url: '/Mysite/Login',
                headers: {
                    'Content-Type': undefined
                },
                data: {
                    model: {
                        Email: email,
                        Password: password,
                        RememberMe: false
                    },
                    __RequestVerificationToken: $("#verification-form input[name=__RequestVerificationToken]").val(),
                    returnUrl: returnUrl
                }
            };
            return $http(req)
                .then(function (response) {
                    return response.data;
                }, function (reason) {
                    return reason;
                });
        };

在您的javascript中,您可以传递其值

height