0

我目前正在使用 asp.net mvc 4。我编写了一个返回 JSON 对象的函数。

这是功能(在我的控制器中)

[HttpPost]
        public ActionResult Login(string email, string password)
        {
            ViewData["Message"] = "None";
            JSONLoginModel model = new JSONLoginModel();

            Account account = _accountRepository.CheckLogin2(email, password);

            if (account != null)
            {
                model.Email = email;
                model.Password = password;
                model.ChangePassword = account.ChangePasswordOnLogin;
            }

            return Json(model);
        }

这是 JSONLoginModel

[Serializable]
    public class JSONLoginModel
    {
        public string Email { get; set; }
        public string Password { get; set; }
        public bool ChangePassword { get; set; }
    }

我还编写了以下 JQuery 代码来捕获和使用它

$.post("Home/Login", { email: email, password: password }, function (data) {
                alert(data);
                $.each(data, function (index, IntraNoviUser) {
                    if (IntraNoviUser !== undefined && IntraNoviUser !== null) {
                        alert('test1');
                        alert(IntraNoviUser.password, IntraNoviUser.email);
                        alert('test2');
                    }
                });
            });

一切都很好,直到我尝试使用返回的结果。

我从控制器返回的是一个可以有 3 个选项的对象:

  1. 空值
  2. 邮箱+密码填写changePassword为假
  3. 与 2 相同,但changePassword = true

问题是我返回的 JSON 对象永远无法识别。对此有任何提示吗?

4

4 回答 4

1

尝试将数据类型设置为 json,如下所示

$.post("Home/Login", { email: email, password: password }, function (data) {
            alert(data);
            $.each(data, function (index, IntraNoviUser) {
                if (IntraNoviUser !== undefined && IntraNoviUser !== null) {
                    alert('test1');
                    alert(IntraNoviUser.password, IntraNoviUser.email);
                    alert('test2');
                }
            });
        },"json");

注意最后一个参数。但是,如果返回的数据不是数组(或 jquery 选择或类似),则上述将迭代每个属性。参数 IntraNoviUser 将保存属性值和索引属性的名称。由于命名似乎有点奇怪,我怀疑您不想迭代返回对象的属性。

如果您返回一个对象并且不想迭代属性,请执行此操作

$.post("Home/Login", { email: email, password: password }, function (IntraNoviUser) {
                if (IntraNoviUser !== undefined && IntraNoviUser !== null) {
                    alert('test1');
                    alert(IntraNoviUser.password, IntraNoviUser.email);
                    alert('test2');
                }
            });
        },"json");

旁白:JavaScript 中的大写字母按惯例保留给 Initializer 函数(需要以 new 为前缀才能正常工作的函数)

编辑因为 JavaScript 区分大小写,您需要在 JS 文件中使用与 C# 文件中相同的大小写。那是电子邮件不是电子邮件,密码不是密码等等。不幸的是,您将不得不打破这两种环境中的任何一种的命名约定。我个人更喜欢打破 C# 命名约定,因为在这种情况下,您可以使用匿名类型

var model =
        {
            email,
            password,
            changePassword = account != null
                                      ? account.ChangePasswordOnLogin 
                                      : false;
        };

return Json(model);
于 2012-08-28T09:18:28.607 回答
1

我认为 asp.net 将 json 数据返回为 d。所以你最好提醒(data.d)并检查它。

$.post("Home/Login", { email: email, password: password }, function (data) {
                if(data!=null || data != undefined){
                   if(data.password==true){
                  //do something
                   }
                 else if(data.password==false){//do something

                   }
                }

            });
于 2012-08-28T09:22:40.297 回答
0

由于您返回的是 JSON 对象,而不是数组,因此您的循环函数将为对象上的每个属性执行一次。如果要遍历对象中的数据,则签名应类似于:

$.each(data, function (key, value) {

在循环内部,您应该通过检查keyvalue适当地使用来检查当前属性的名称。

但是,正如 Anthony 在评论中指出的那样,似乎根本不需要循环,因为您知道对象属性的名称,您可以通过名称访问它们。

于 2012-08-28T09:18:48.377 回答
0

我设法通过使用以下代码解决了这个问题:

    $.post("Home/Login", { email: email, password: password }, function (IntraNoviUser) {
                    if (IntraNoviUser !== undefined && IntraNoviUser !== null) {
                        alert('test1');
                        alert(IntraNoviUser.Password + " " + IntraNoviUser.Email + " " + IntraNoviUser.ChangePassword);
                        alert('test2');
                        var t = IntraNoviUser;
                        alert(t.Password + " " + t.Email + " " + t.ChangePassword);
                    }

});

返回的 JSON 使用的是我的 IntraNoviLoginModel 中的字段,因此它需要大写字母才能工作。

我要感谢 Anthony Grist 和 Ashirvad Singh 为我指明了正确的方向。

于 2012-08-28T10:11:15.870 回答