如何使用mvc的JSON对象?

时间:2012-08-28 09:12:57

标签: jquery asp.net-mvc json asp.net-mvc-4

我目前正在使用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. 电子邮件+密码已填写且changePassword为false
  2. 与2相同,但changePassword = true
  3. 问题是我永远无法识别我返回的JSON对象。 有什么暗示吗?

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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

                   }
                }

            });

答案 2 :(得分:0)

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

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

在循环内部,您应检查key并检查当前属性的名称,并正确使用value

然而,正如Anthony在评论中指出的那样,似乎根本不需要循环,因为您知道对象属性的名称,您只需按名称访问它们。

答案 3 :(得分: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在这里指出了正确的方向。