2011-11-24 150 views
2

我在学习如何编写更多使用Ajax的动态网站。我发现的例子似乎只将一个字符串参数传递给服务。稍微看了一些后,我发现有些开发人员通过创建对象并使用JSON序列化对象来传递多个值。使用简单的JSON Hello World应用程序遇到问题

所以,我想创建一个简单的HelloWorld应用程序,在两个方向传递对象。例如,一个服务将一个.NET对象序列化为JSOn,并将其传递回浏览器以便通过Javascript进行解析,还有一个示例,其中一个Javascript对象在客户端序列化为JSON,然后反序列化为.NET对象在服务器上。要序列化JavaScript对象到JSON,我发现一个JavaScript程序,json.js,在json.org,

我简单的例子,有以下包含文件:

<script language="javascript" type="text/javascript" src="Scripts/jquery-1.4.1.js"></script> 
<script language="javascript" type="text/javascript" src="Scripts/json.js"></script> 
<script language="javascript" type="text/javascript" src="Scripts/script.js"></script> 

第三是我自己的js文件,其中包括以下代码:

function CallHandler() 
{ 

    $.ajax({ 
     url: "Handlers/Handler1.ashx", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     data: { 'Id': '101', 'Name': 'Chad' }, 
     responseType: "json", 
     success: OnComplete, 
     error: OnFail 
    }); 
    return false; 
} 

function CallHandler2() 
{ 
    var EmployeeSerialized = JSON.stringify(GetInput()); 

    $.ajax({ 
     url: "Handlers/Handler2.ashx", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     data: EmployeeSerialized, 
     responseType: "json", 
     success: OnComplete2, 
     error: OnFail 
    }); 
    return false; 
} 

function GetInput() 
{ 
    var emp = new Object(); 
    emp.Name = 'Brij'; 
    emp.Age = '27'; 
    return emp; 
} 
function OnComplete(result) 
{ 
    alert(result.ID + ' ' + result.Name + ' ' + result.Age + ' ' + result.Timestring); 
} 

function OnComplete2(result) 
{ 
    alert("Complete2"); 
} 

function OnFail(result) 
{ 
    alert('Ajax failed' + result); 

} 

它是从以下网页调用:

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="WebForm1.aspx.vb" Inherits="WebApplication2.WebForm1" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
    <script language="javascript" type="text/javascript" src="Scripts/jquery-1.4.1.js"></script> 
    <script language="javascript" type="text/javascript" src="Scripts/json.js"></script> 
    <script language="javascript" type="text/javascript" src="Scripts/script.js"></script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:Button ID="Button1" runat="server" Text="CallHandler" OnClientClick="CallHandler();" /> 
     <asp:Button ID="Button2" runat="server" Text="CallHandler2" OnClientClick="CallHandler2();" /> 
    </div> 
    </form> 
</body> 
</html> 

我的问题是我无法同时使两个按钮事件同时工作。例如,现在,如果我包含全部3个INCLUDE语句,则只有Callhandler2事件成功地调用其服务器端Httphandler。但是,如果我注释掉json.js INCLUDe文件,第一个可以工作,但第二个可以打破。显然,第二个因为需要在被移除的js文件中找到的Stringify函数而中断。问题是,为什么包含json.js文件会破坏Callhandler2事件?肯定会有某种冲突。

考虑到我应该尝试最新版本的jQuery库,我试图包括版本1.6.2,但是,当CallHandler2 buton被推送时,这只会引入JSON解析错误,之前发生。

我发现使用Javascript非常令人沮丧,与我在服务器双面开发方面的经验相比,有很多原因,包括缺乏良好的错误消息。在这种情况下,我没有错误消息,功能就会中断。

因为我认为你可能很难找到错误,所以我发布了我的代码。这是我的小型Visual Studio 2010 project。如果你下载我的项目,你可能需要重置文件上的只读标志,如果你想修改它们。对于那个很抱歉。

更新:

我看到的错误是在json.js的554线:

// If the text is not JSON parseable, then a SyntaxError is thrown. 

throw new SyntaxError('JSON.parse'); 

我看到变量EmployeeSerialized计算结果为

{"Name":"Brij","Age":"27"} 

,然后当我尝试将EmployeeSerialized JSON字符串值作为数据传递给该函数时,Callhandler2函数中的ajax调用会死亡,并显示以下错误Handler2 HttpHandler。

SCRIPT5022: Exception thrown and not caught 
json.js, line 554 character 13 

什么,如果有的话,这个JSON字符串是错误的?

+0

什么是JavaScript控制台报告的错误? – Justin808

+1

你可以在这里验证你的json字符串是否有任何错误:http://jsonlint.com/ – Neelam

+0

如果你没有绑定到旧版本的jQuery,请升级到最新版本(截至本评论为止1.7.1)。如果有错误,可以解决! –

回答

1

它不是你的代码,与json.js和jquery有冲突。使用https://github.com/douglascrockford/JSON-js中的json2.js文件,事情应该更好。

Json JQuery conflict答案了类似/相同的问题

+0

你摇滚。在我的努力早期,我尝试了json2但遇到了麻烦。像我这么多的JavaScript工作,我通常不知道问题是什么,因为我没有任何错误。最终我回到了json.js文件的原始版本,并得到了上面解释的结果。我不知道我的原始问题是与json2文件,但现在它的工作原理,我非常感谢你的快速和有益的答复。我讨厌Javascript的人。我不明白开发人员如何使用JavaScript编写Web应用程序。给我强大的打字,早期的绑定和良好的智能感知 – ChadD

+1

JQuery是一个更安全的生活,我每天都会在网页开发中使用它。我建议让Chrome开发javascript。一旦它在那里工作,然后在FF/IE/Opera中检查它。 Chrome内置了很棒的工具来帮助你开发(右键单击,检查)。如果你遇到问题,我推荐使用console.write('debug')或者只是一个很好的旧警报('debug')。如果您有关于JQuery的问题,请问这里有很多人使用它并且很好地了解它。 – Justin808

+0

没有更标准的jQuery函数来将JavaScript对象转换为JSON字符串,而不是依赖于这个附加的json2.js脚本。我看到有一个函数用于传递oether方法:var JavascriptObject = jQuery.parseJSON(JsonString)。 – ChadD

相关问题