【问题标题】:Parsing string AngularJS $http to .NET Core controller将字符串 AngularJS $http 解析为 .NET Core 控制器
【发布时间】:2017-03-30 20:56:58
【问题描述】:

我正在尝试将 AngularJS 与 NET Core 结合使用。目前正在尝试解析“字符串用户名”、“字符串密码”和“bool rememberMe”,但无论我做什么,这两个字符串都是空的。我什至尝试解析如下所示的常量值,即参数“test”,但即使这样也不起作用。我已经在 Fiddler 中确认脚本实际上是在解析值,所以控制器基本上无法“获取它”。

下面是我的 AngularJS loginController 代码。

var login = angular.module('login', []);
login.controller('LoginController',
    [
        '$scope', '$http', '$window', function ($scope, $http, $window) {
            $scope.submit = function () {
                var data = { test: ':D' };
                $http({
                    method: 'POST',
                    url: '/admin',
                    data: data
                }).then(function success(response) {
                    alert(response.data.test);
                });
            }
        }
    ]);

下面是我的 ActionResult 的代码,用于获取发布到它的值。

[HttpPost]
        public IActionResult Index(string test)
        {
            return Json(new
            {
                test,
                bla = "BLA"
            });
            //if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
            //{
            //    if (UserSystem.Login(username, password, rememberMe, HttpContext))
            //    {
            //        HttpContext.Response.StatusCode = (int)HttpStatusCode.Accepted;
            //        return Json(new
            //        {
            //            returnUrl = "/admin/dashboard"
            //        });
            //    }
            //}
            //HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
            //return Json(new
            //{
            //    error = "Username and/or password do not match"
            //});
        }

我也尝试过指定 Content-Type,但也没有运气。无论哪种方式,在 Fiddler 中,请求似乎总是默认为 application/json。

我希望有人可以帮助我。谢谢!

【问题讨论】:

  • 您确定向正确的端点发出请求吗? /admin 路由到什么?
  • 我确定。正如您在 ActionResult 中看到的,它返回一个常量值“bla = "BLA",我可以很好地得到这个值。

标签: c# angularjs json


【解决方案1】:

解决方案是在控制器中请求一个对象,而不是“字符串用户名”、“字符串密码”和“bool rememberMe”。

控制器现在看起来像这样:

    public class LoginModel
    {
        public string Username { get; set; }
        public string Password { get; set; }
        public bool RememberMe { get; set; }
    }
    [HttpPost]
    public IActionResult Index([FromBody]LoginModel model)
    {
        if (!string.IsNullOrEmpty(model.Username) && !string.IsNullOrEmpty(model.Password))
        {
            if (UserSystem.Login(model.Username, model.Password, model.RememberMe, HttpContext))
            {
                HttpContext.Response.StatusCode = (int)HttpStatusCode.Accepted;
                return Json(new
                {
                    returnUrl = "/admin/dashboard"
                });
            }
        }
        HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
        return Json(new
        {
            error = "Username and/or password do not match"
        });
    }

AngularJS 控制器现在看起来像这样:

var login = angular.module('login', []);
login.controller('LoginController',
    [
        '$scope', '$http', '$window', function ($scope, $http, $window) {
            $scope.submit = function () {
                var data = {
                    username: $scope.username,
                    password: $scope.password,
                    rememberMe: $scope.rememberMe
                };
                $http({
                    method: 'POST',
                    url: '/admin',
                    data: data
                }).then(function success(response) {
                    $window.location.href = response.data.returnUrl;
                }, function fail(response) {
                    swal('Error!', response.data.error, 'error');
                });
            }
        }
    ]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多