我目前正在使用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个选项的对象:
changePassword
为false changePassword = true
问题是我永远无法识别我返回的JSON对象。 有什么暗示吗?
答案 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在这里指出了正确的方向。