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はプロパティ値を保持し、インデックスはプロパティの名前を保持します。名前は少し奇妙に思えるので、返されたオブジェクトのプロパティを繰り返したくないのではないかと思います。

1つのオブジェクトが返され、プロパティを繰り返したくない場合は、これを実行します

$.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#ファイルと同じ大文字と小文字を使用する必要があります。つまり、電子メールではなく電子メール、パスワードではなくパスワードなどです。2つの環境のいずれかの命名規則に違反しなければならないのは少し残念です。個人的には、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オブジェクトを返すため、ループ関数はオブジェクトのプロパティごとに1回実行されます。オブジェクト内のデータを反復処理する場合、署名は次のようになります。

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

ループ内では、適切に検査keyして使用することにより、現在のプロパティの名前を確認する必要がありvalueます。

ただし、コメントで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 に答える