【问题标题】:Getting status 500 when using angularjs $http to get data from server使用 angularjs $http 从服务器获取数据时获取状态 500
【发布时间】:2017-04-26 11:33:19
【问题描述】:

我正在开发一个 asp.net mvc 应用程序,我在其中使用实体框架和 AngularJS。我正在使用 AngularJS 的 $http 服务来调用操作方法并从服务器检索数据。从服务器检索到正确的数据(我通过调试确认了这一点),但是在 action 方法返回检索到的数据并且触发错误回调函数而不是成功回调函数之后,不知何故发生了错误。然后我在浏览器的控制台中得到一个状态 500。

以下是涉及的代码块:

(来自 angularjs 控制器)

    $http({
        url: rootUrl + "User/GetUser",//'@Url.Action("GetUser","User")',
        method: 'POST',
        params: {
            uname: $scope.username,
            pword: $scope.pass
        }
    }).then(function (response) {
        alert('success!');
        $scope.user = response.data;
        if ($scope.user.Fullname != undefined) {
            $http({
                url: rootUrl + "Session/Set",
                method: "POST",
                data: {
                    "key": "curr_user",
                    "value": JSON.stringify($scope.user)
                }
            });

            window.location.href = rootUrl + 'Product/List/';

        } else {
            //invalid login
            $("input[name='password']").select();
            $("#validation-summary").html("Wrong email or password.");
            $scope.invalidlogin = true;
            $(btnLogin).removeClass('disabled');
            $(btnLogin).text("Submit");

        }

(来自 mvc 控制器)

    [HttpPost]
    public JsonResult GetUser(string uname, string pword)
    {
        JBManager manager = null;

        using (SE_Context db = new SE_Context())
        {
            try
            {
                manager = db.Managers
                    .Include("Transactions.Items")
                    .Where(m => m.Username == uname && m.Password == pword)
                    .FirstOrDefault();
                //At this point, manager has the desired data
                return Json(manager, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                return null;
            }
        }
    }

这是浏览器中错误的屏幕截图:

非常感谢任何帮助。谢谢!

更新: 在我使用实体框架之前一切正常。 (以防万一它与问题有关)

【问题讨论】:

  • 首先,您需要在动作标头和 ajax 调用中从 HttpPost 更改为 HttpGet,并且在从动作返回时包括 JsonRequestBehaviour.AllowGet。
  • 那么如何正确处理异常而不是“返回null”?
  • @Rudresh 将请求类型从 POST 更改为 GET 不会在 URL 中暴露用户名和密码吗?
  • 不返回null,而是返回Json("")
  • @TigOldBitties 怎么样?

标签: angularjs asp.net-mvc entity-framework


【解决方案1】:

我认为您的问题是嵌套对象。您可以使用 DTO(数据传输对象)展平包含嵌套对象的对象图。

您可以尝试如下简单示例。如果它可以工作,那么您需要扩展它以使用您的 EF 查询。

public class MyDto
    {
        public string Name { get; set; }
    }


    [HttpPost]
    public JsonResult GetUser(string uname, string pword)
    {
        JBManager manager = null;

        using (SE_Context db = new SE_Context())
        {
            try
            {
               //construct the DTO here
                manager = db.Managers.Select(a=> new MyDto(
                {
                 Name = a.Name
                 })).FirstOrDefault(m => m.Username == uname && m.Password == pword);

                return Json(manager, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                return null;
            }
        }
    }

您可以在此处阅读有关 DTO 的更多信息:Create Data Transfer Objects (DTOs)

【讨论】:

  • 我尝试阅读有关 DTO 的信息,但我似乎无法理解它与我的问题的相关性。您能否简要解释一下 DTO 如何提供帮助,或者至少为我指出一篇关于 DTO 的好文章?谢谢。
  • 我放了一个参考。请看那个。
  • 对此有何反馈?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 2021-01-11
  • 2014-06-18
  • 2012-12-24
  • 1970-01-01
  • 2015-11-05
  • 2015-07-15
相关资源
最近更新 更多