C# 传递给ASP.NET处理程序的Javascript对象

C# 传递给ASP.NET处理程序的Javascript对象,c#,javascript,asp.net,json,httphandler,C#,Javascript,Asp.net,Json,Httphandler,如何将JavaScript对象传递到ASP.NET处理程序并解析值 我创建了一个复杂类型的对象,如: function AccountObjCreate() { var AccountsView = {}; AccountsView.Username = null; AccountsView.Email = null; AccountsView.Password = null; return AccountsView; } var aView = AccountObjCreate(); aV

如何将JavaScript对象传递到ASP.NET处理程序并解析值

我创建了一个复杂类型的对象,如:

function AccountObjCreate() {
var AccountsView = {};
AccountsView.Username = null;
AccountsView.Email = null;
AccountsView.Password = null;

return AccountsView;
}
var aView = AccountObjCreate();
aView.Username = $('#tbUserName').val().trim();
aView.Email = $('#tbEmail').val().trim().toLowerCase();
aView.Password = $('#tbPassword').val().trim();
然后像这样填充该对象:

function AccountObjCreate() {
var AccountsView = {};
AccountsView.Username = null;
AccountsView.Email = null;
AccountsView.Password = null;

return AccountsView;
}
var aView = AccountObjCreate();
aView.Username = $('#tbUserName').val().trim();
aView.Email = $('#tbEmail').val().trim().toLowerCase();
aView.Password = $('#tbPassword').val().trim();
那么我打电话:

$.post("/Handlers/AccountHandler.ashx", { obj: aView },
        function (results) {
            if (results.isSuccess) {
                alert(results.msg);
            } else {
                alert(results.msg);
            }
        }, "json");
当我在控制台中查看它时,我看到aView中的所有数据都是json

我的ASP.NET处理程序页是

context.Response.ContentType = "application/json";
context.Response.ContentEncoding = Encoding.UTF8;
string obj = context.Request["obj"];

但是obj为空。

为了将对象传递到服务器,应该将其序列化为字符串(可以使用所述方法或包含javascript的JSON库),然后使用.NET
JavaScriptSerializer
类对其进行反序列化

public class AccountsView {
    public string Username;
    public string Email;
    public string Password;
}

public void ProcessRequest(HttpContext context)
{
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    string value = context.Request["obj"];
    var aView = serializer.Deserialize(value, typeof(AccountsView));

    context.Response.ContentType = "application/json";
    context.Response.ContentEncoding = Encoding.UTF8;
}
JS代码

var data = {
    obj: JSON.stringify(aView)
};
$.post("/Handlers/AccountHandler.ashx", data, function(results) {
    if (results.isSuccess) {
        alert(results.msg);
    } else {
        alert(results.msg);
    }
}, "json");​
然后在服务器处理程序上,您可以使用前面提到的
JavaScriptSerializer
类解析JSON字符串

public class AccountsView {
    public string Username;
    public string Email;
    public string Password;
}

public void ProcessRequest(HttpContext context)
{
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    string value = context.Request["obj"];
    var aView = serializer.Deserialize(value, typeof(AccountsView));

    context.Response.ContentType = "application/json";
    context.Response.ContentEncoding = Encoding.UTF8;
}

jQuery不会自动为您字符串化对象。你必须自己做

下载此文件:

将脚本引用添加到HTML并更改
$。将调用发布到:

$.post("/Handlers/AccountHandler.ashx", { obj: JSON.stringify(aView, null, 2) }...
ContentType也不正确。我会把它作为默认设置。虽然您将以这种方式提交JSON数据,但ContentType本身不是JSON。内容类型将是常规post数据。这是post数据:

obj={"Username":"MyUsername", "Password":"MyPassword"...
这是JSON

{"obj":{"Username":"MyUsername", "Password":"MyPassword"...
有时会让人困惑

更好的方法是研究ASP.NETMVC。控制器方法能够自动将JSON对象反序列化为.Net模型,因此您可以在客户端代码上执行此操作:

$.post("/Handlers/AccountHandler.ashx", JSON.stringify({ view: aView }, null, 2) }...
编写一个与aView结构匹配的.Net类:

class Account { 
    public string Username { get; set; } 
    public string Password { get; set; }
    public string Email { get; set; }
}
然后定义一个控制器方法,如下所示:

public JsonResult SaveAccount(Account view)

使事情简单得多。:)

更简单,但对于仍然只在.NET2.0上运行的糟糕项目,juan.facorro的解决方案是可以采用的。