我希望在aspx页面中将json对象传递给WebMethod
这是我的jquery和WebMethod
$("#button-login").bind({
Click: accountRegister
});
function accountRegister(e) {
var dataObj = $("#login input[type]").serializeArray();
var obj = JSON.stringify(dataObj);
$.ajax({
type: "POST",
url: "Checkout.aspx/login",
data: obj,
contentType: "application/json; charset=UTF-8",
dataType: "json",
beforSend: function () {
$(this).attr("disabled", "true");
$(this).after(waitObj);
},
success: function (msg) {
// Replace the div's content with the page method's return.
alert("success");
$("#checkout").slideUp("slow");
$("#payment-address").slideDown("slow");
},
error: function (msg) {
//alert(msg);
},
complete: function (jqxhr,status) {
alert("Type:" + $.type(jqxhr) + "\n Respons text: " + jqxhr.responseText + "\n status: " + status);
$(this).attr("disabled", "false");
$(".wait").remove();
},
});
}
我的checkout.cs文件
namespace Ahooratech
{
public partial class Checkout : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
[WebMethod]
public static string login(string obj)
{ return "{data:data}";}
}
我收到此错误:
响应文字:{“Message”:“Type \ u0027 **** System.Collections.Generic.IDictionary`2 **** [[System.String,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089 ],[System.Object,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]] \ u0027不支持反序列化数组。“,
“StackTrace”:“System.Web.Script.Serial.V.在一个System.Web.Script.Serial化处理过程中的System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList列表,Type类型,JavaScriptSerializer序列化程序,Boolean throwOnError,IList \ u0026转换列表)\ r \ n。在System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain中转换ObjectToTypeInternal(Object o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object \ u0026 convertedObject)\ r \ n(Object o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object \ System.Web.Script.Serialization.JavaScriptSerializer.Deserialize [T]中System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer序列化程序,字符串输入,类型类型,Int32 depthLimit)\ r \ n的转换对象)\ r \ n在System.Web.Script.Script.Services.RestHandler.GetRawParams(WebServiceM)的System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext上下文,JavaScriptSerializer序列化程序)\ r \ n中输入(字符串输入)\ r \ n ethodData methodData,HttpContext context)\ r \ n在System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context,WebServiceMethodData methodData)“,”ExceptionType“:”System.InvalidOperationException“}
编辑:错误代表一个类型castiny但这个铸造在哪里? (我认为JQuery中存在隐式类型转换)
EDITE:这是我的obj内容以json形式发送到服务器
"[{"name":"userName","value":"admin"},{"name":"password","value":"admin_"}]"
我认为这行accountRegister()对此:
var obj = JSON.Stringify({data:dataObj});
并在WebMethod中修改为:
public static string void login(Object data){
}
它的工作原理!
但我怎么能ID Deserilize数据
我怀疑在将登录功能的参数更改为类型对象时不会出错。
实际上我会将所有参数分别传递给webmethod而不是一个对象。
我装饰我的ajax方法
function accountRegister(e) {
var data = $("#login input[type]").serializeArray();
var str="[";
$.each(data, function(index , value)
{
str += '{' + '"name"' + ":" + "\"" + value.name + "\"" + ', ' + '"value"' + ":" + "\"" + value.value + "\"" + '},';
});
// remove last char ","
data = str.substr(0, str.length - 1);
data += "]";
$.ajax({
type: "POST",
url: "Checkout.aspx/login",
data: JSON.stringify({ myData: data }),
contentType: "application/json; charset=UTF-8",
dataType: "json",
// converts: { "html text": function(data) { return $(data);}},
//dataFilter: function(data,dataType) { if(dataType == "json") { var dataFilter = $.parseJSON(data); return data; } else return data; },
beforSend: function () {
$(this).attr("disabled", "true");
$(this).after(waitObj);
},
success: function (msg) {
// Replace the div's content with the page method's return.
alert("success");
// $("#checkout").slideUp("slow");
// $("#payment-address").slideDown("slow");
},
和web方法到此
public class nameVal
{
public string name { get; set; }
public string value { get; set; }
}
[WebMethod]
public static string login(object myData)
{
JavaScriptSerializer js = new JavaScriptSerializer();
List<nameVal> myformElement = js.Deserialize<List<nameVal>>(myData.ToString());
return "";
}
不幸的是,你不能将任何数组作为根对象传递给WebMethod
。您必须使用javascript对象封装数据。您的根对象键也应与WebMethod
的参数匹配。
如果要传递数组,可以使用该格式。
JSON.stringfy({myArray: [1,2,3]})
在这种情况下;你的WebMethod
签名应该是这样的
[WebMethod]
public static void MethodName(IEnumerable<object> myArray);
内部类型的枚举可以是任何类型,但参数名称应与json对象的参数名称匹配。