这个问题已被多次询问和回答,但我无法让它发挥作用。我的问题看起来像one,one和third example。
我想要做的是在this和this问题中填写JSON对象的选项框。它们都略有不同,但相似,但我无法让它发挥作用。这是来自webservice的代码:
<System.Web.Script.Services.ScriptService()> _
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class Service
Inherits System.Web.Services.WebService
<WebMethod()> _
<ScriptMethod(ResponseFormat:=ResponseFormat.Json)> _
Public Function HelloWorld(ByVal p_productCategoryId As Integer) As String
Dim productCategory = ProductService.GetProductCategory(p_productCategoryId)
'Dim productList = ProductService.GetProducts(productCategory)
Dim productList = New List(Of Product)
For cnt = 1 To 3
Dim product = New Product(cnt)
product.Productname = cnt.ToString & "|" & cnt.ToString
productList.Add(product)
Next
Return productList.ToJSON
End Function
End Class
<System.Runtime.CompilerServices.Extension()> _
Public Function ToJSON(Of T)(p_items As List(Of T)) As String
Dim jSearializer As System.Web.Script.Serialization.JavaScriptSerializer = New System.Web.Script.Serialization.JavaScriptSerializer()
Return jSearializer.Serialize(p_items)
End Function
如果我使用以下代码:
function Test() {
$.ajax({
type: "POST",
url: "Service.asmx/HelloWorld",
data: "{'p_productCategoryId' : 1 }",
contentType: "application/json; charset=utf-8",
dataType: "json",
success:function(msg){
alert(msg.d)
},
error: function() {
alert("An error has occurred during processing your request.");
}
});
};
我得到了这个结果:
[{"Id":1,"IsActive":false,"Category":null,"Productname":"1|1","Price":0},
{"Id":2,"IsActive":false,"Category":null,"Productname":"2|2","Price":0},
{"Id":3,"IsActive":false,"Category":null,"Productname":"3|3","Price":0}]
这似乎没问题。
如果我从msg中删除'd'。警报的结果是:
[object Object]
填写选项框的'正在进行中的'代码是这样的(目前:):
function Test() {
$.ajax({
type: "POST",
url: "Service.asmx/HelloWorld",
data: "{'p_productCategoryId' : 1 }",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
$("#prd_id").empty().append($("<option></option>").val("[-]").html("Please select"));
$.each(msg.d, function () {
$("#prd_id").append($("<option></option>").val(this['Id']).html(this['Productname']));
});
},
error: function () {
alert("An error has occurred during processing your request.");
}
});
};
我已经尝试了几种方法从我之前提到的例子中获取它,但无济于事。使用msg.d填充选项框,其中包含字符串中的字符数。我尝试使用'getJSON'从'msg'显式创建一个JSON对象。 (那不是“数据类型”用于吗?)我不能使用命名对象,因为我没有在示例数据中看到的那样。我错过了什么?
有些我无法获取代码以查看数组有三个条目。
答案 0 :(得分:1)
我可能会使用Option
构造函数而不是HTML。
假设msg.d
实际上是数组(.d
属性是ASP.Net的东西):
success: function (msg) {
var options = $("#prd_id")[0].options;
options.length = 0;
options.add(new Option("Please select", "[-]"));
$.each(msg.d, function () {
options.add(new Option(this.Productname, this.Id));
});
},
Option
构造函数将文本作为第一个参数,将值作为第二个参数。 options
元素上的select
列表有点像数组,但为了与旧浏览器兼容,而不是push
您使用add
(或分配给{{ 1}},或者都有效。)
如果options[options.length]
是数组(不是msg
),只需删除.d
:
.d
如果您的回复没有以正确的MIME类型发回,success: function (msg) {
var options = $("#prd_id")[0].options;
options.length = 0;
options.add(new Option("Please select", "[-]"));
$.each(msg, function () {
options.add(new Option(this.Productname, this.Id));
});
},
实际上可能是文本,而不是数组。如果是这样,您希望通过返回正确的MIME类型(msg
)来修复服务器上的问题,尽管可以手动解析它:
application/json
...然后使用上面的内容。或者当然,如果它以msg = $.parseJSON(msg);
的形式回归(虽然这似乎不太可能):
msg.d
答案 1 :(得分:0)
你可以这样做:
$.each(msg.d, function (key, value) {
$("#prd_id").append($("<option/>").val(value.Id).html(value.Productname));
});
答案 2 :(得分:0)
我尝试根据你的问题复制我的REST WCF,它返回相同的JSON数据,以及下面的示例工作,
<script type="text/javascript">
$(document).ready(function() {
});
var GetRawList = function() {
$.ajax({
type: "GET",
url: "RestService/HelloWorld",
contentType: "application/json;charset=utf-8",
dataType: "json",
success: function(data) {
//Change this "data.d" According to your returned JSON output header.
var result = data.d;
$("#prd_id").empty().append($("<option></option>").val("[-]").html("Please select"));
$.each(result, function(key, value) {
$("#prd_id").append($("<option/>").val(value.Id).html(value.Productname));
});
},
error: function(xhr) {
alert(xhr.responseText);
}
});
}