2

JavaScript オブジェクトを ASP.NET Handler に渡し、値を解析するにはどうすればよいですか?

次のような複合型オブジェクトを作成しました。

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は NULL です。

4

2 に答える 2

5

オブジェクトをサーバーに到達させるには、オブジェクトを文字列にシリアル化し(ここで説明するメソッドを使用するか、ここにjavascriptのJSONライブラリを含めることができます)、.NETJavaScriptSerializerクラスを使用して逆シリアル化する必要があります。

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;
}
于 2012-11-16T21:41:28.097 に答える
3

jQuery は、オブジェクトを自動的に文字列化するわけではありません。あなたはそれを自分でしなければなりません。

これをダウンロードしてください: https://github.com/douglascrockford/JSON-js

スクリプト参照を HTML に追加し、$.post呼び出しを次のように変更します。

$.post("/Handlers/AccountHandler.ashx", { obj: JSON.stringify(aView, null, 2) }...

また、ContentType が正しくありません。デフォルトのままにしておきます。この方法で JSON データを送信しますが、ContentType 自体は JSON ではありません。コンテンツタイプは通常の投稿データになります。これは投稿データです:

obj={"Username":"MyUsername", "Password":"MyPassword"...

これはJSONです

{"obj":{"Username":"MyUsername", "Password":"MyPassword"...

時々混乱することがあります。

より良いアプローチは、ASP.Net MVC を調べることです。コントローラー メソッドは、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)

物事をずっと簡単にします。:)

于 2012-11-16T21:43:29.503 に答える