col*_*mbo 7 asp.net ajax jquery json asmx
我意识到这里已经有很多类似的问题,但我无法想出这个问题.
我有一个Web服务(C#,.net 3.5).您需要了解的基本代码如下:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class WSMember : System.Web.Services.WebService {
public WSMember () {
}
[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public string GetMember(string IdMember)
{
//Ignore the parameter for now... I will be looking up a database with it...
//For now just return a minimal object:
Member m = new Member();
m.Surname = "Smith";
m.FirstName = "John";
return new JavaScriptSerializer().Serialize(m);
}
Run Code Online (Sandbox Code Playgroud)
另外,在web.config中,我做了以下添加(我刚刚在其他帖子中看到过......这是正常/安全吗?)
<webServices>
<protocols>
<add name="HttpGet" />
<add name="HttpPost" />
</protocols>
</webServices>
Run Code Online (Sandbox Code Playgroud)
然后在Default.aspx中,我是两个关键参考...
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript" src="jquery.json-2.2.min.js" ></script>
Run Code Online (Sandbox Code Playgroud)
jquery.json-2.2.min.js是从谷歌代码下载的
这是Javascript:
<script type="text/javascript">
$(document).ready(function() {
$("#button1").click(function(event) {
var myData = { IdMember: "2" };
var encoded = $.toJSON(myData);
alert(encoded);
$.ajax({
type: "POST",
url: "WSMember.asmx/GetMember",
data: encoded,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
alert("worked" + msg.d);
//$("#sidebar").append(msg);
},
error: function(msg) {
alert(msg.d);
//$("#sidebar").append(msg);
}
});
});
});
</script>
Run Code Online (Sandbox Code Playgroud)
当我执行它时,编码的json按预期显示在消息框中...即使用双引号:
{"IdMember":"2"}
但是,它总是失败.即使对于没有传入数据的最基本的Hello World,它也会失败.我不断收到消息数据的"未定义".
如果我只使用alert(msg),它会显示[object XMLHttpRequest]
有谁知道我的数据丢失的地方?
还有一个问题......我正在做的事情有什么根本的错误吗?
非常感谢.
编辑:
谢谢你的回复.我试过以下这样......
UseHttpGet = true现在更改为false.(再次 - 我在某个地方看到它,所以我尝试了......但我知道它不对: - /)
假设Web服务现在返回一个字符串.我按如下方式构建字符串(似乎有点疯狂......序列化它做了完全相同的事情......)
StringBuilder sb = new StringBuilder();
sb.Append("{");
sb.Append("\"Surname\":");
sb.Append("\"");
sb.Append(m.Surname);
sb.Append("\"");
sb.Append(",\"FirstName\":");
sb.Append("\"");
sb.Append(m.FirstName);
sb.Append("\"");
sb.Append("}");
return sb.ToString();
Run Code Online (Sandbox Code Playgroud)
此代码返回如下内容:
{"Surname":"Smith","FirstName":"John"}
Run Code Online (Sandbox Code Playgroud)
我仍然得到完全相同的错误......
我还尝试过返回对象"Member",因此代码变为:
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public Member GetMember(string IdMember)
{
Member m = new Member();
m.Surname = "Smith";
m.FirstName = "John";
return m;
}
Run Code Online (Sandbox Code Playgroud)
这也会引发同样的错误.
很抱歉是一个痛苦...我已经阅读了这两个链接和其他链接.只是看不出为什么这有什么不同.
是否有任何额外的配置设置我需要注意可能??
非常感谢您的回复.
更新: 问题得到解决.上述代码中的关键错误是:
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
Run Code Online (Sandbox Code Playgroud)
应该
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
Run Code Online (Sandbox Code Playgroud)
另外,在表单上,当使用按钮调用javascript时,我错误地设置了输入类型...
<input id="button1" type="submit" value="Just a test" />
Run Code Online (Sandbox Code Playgroud)
什么时候应该说:
<input id="button1" type="button" value="Just a test" />
Run Code Online (Sandbox Code Playgroud)
非常感谢所有帮助过的人.
在我看来,您的主要问题是尝试手动使用JavaScriptSerializer().Serialize而不是返回对象。来自 Web 服务的响应将进行双重 JSON 编码。
你是对的!有很多密切的问题。请查看此处Can I return JSON from an .asmx Web Service if ContentType is not JSON? 并且Can't get jQuery Ajax to parse JSON webservice result你会(我希望)找到答案。
更新:抱歉,您在未发布的地方有一个小错误。为了解决这个问题,我使用旧版本的 Visual Studio (VS2008) 创建了一个小项目,该项目几乎完全符合您的代码并且可以工作。我将其放在http://www.ok-soft-gmbh.com/jQuery/WSMember.zip上。您可以下载它、编译并验证它是否有效。然后你可以将你的代码与我的代码进行比较并找到你的错误。
此致
| 归档时间: |
|
| 查看次数: |
30557 次 |
| 最近记录: |