2012-08-28 39 views
0

我目前在asp.net mvc 4中工作。我寫了一個返回JSON對象的函數。如何使用mvc使用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是假
  2. 相同2,但changePassword = true

問題是我的返回的JSON對象永遠不會被識別。 對此有何暗示?

+0

'alert(data)'顯示什麼?你有沒有檢查過你是否返回有效的JSON(並且可以包含問題中返回的內容)?警報(數據)顯示[object Object]; –

+0

其他警報顯示未定義。我會用我的JSONLoginModel更新我的問題 – whodares

+1

我更感興趣的是看到返回給瀏覽器的實際JSON。 –

回答

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 

        } 
       } 

      }); 
+0

即使在使用.d – whodares

+0

之後,我仍然可以獲得[object Object]嗎?你可以檢查你在firebug中檢測到什麼響應或者在chrome中檢查元素。 – Ashirvad

+0

console - > answer returns {「Email」:「email」,「Password」:「密碼「,」ChangePassword「:false}這是全部正確的信息 – whodares

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中的大寫字母是由初始化程序功能預留的約定(需要功能與新的前綴以正確工作)

編輯由於JavaScript區分大小寫,因此您需要在JS文件中使用與C#文件中相同的套管。這是電子郵件而不是電子郵件,密碼不是密碼等等。有點不幸的是,你將不得不打破兩種環境之一的命名約定。 我個人比較喜歡,因爲打破了C#命名約定,在這樣的情況下,你可以做一個匿名類型

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

return Json(model); 
+0

確實,我只返回1類型。我曾嘗試設置「json」,但它並沒有幫助我。結果沒有變化。 – whodares

+0

@ThomasSchellekens您使用json嘗試了上面兩個中的哪一個? (以及服務器返回的實際字符串是什麼?) –

+0

我試過了最下面的一個。服務器返回的實際字符串是{「Email」:「email」,「Password」:「password」,「ChangePassword」:false}這是正確的。 – whodares

0

因爲你是返回一個JSON對象,而不是一個數組,你的循環功能將執行對象上的每個屬性一次。如果你想通過在對象中的數據進行迭代,然後簽名應與此類似:

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

裏面的循環,你應該通過檢查key檢查當前屬性的名稱和正確使用value

但是,正如Anthony在評論中指出的那樣,似乎完全不需要循環,因爲您知道對象屬性的名稱,您可以通過名稱訪問它們。

+0

由於它是單個對象,並且循環內的所有邏輯似乎都與該對象的屬性有關,所以迭代似乎完全沒有必要。 –

+0

同意 - 答案已更新。 – codebox

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); 
        } 

}); 

這是使用領域從我IntraNoviLoginModel返回的JSON,所以它需要資金的工作。

我想感謝Anthony Grist和Ashirvad Singh指點我在這裏的正確方向。

+0

然後不要忘記upvote他們:) –

+0

感謝提醒我,忘記所有關於我的午餐休息*臉紅* – whodares