2009-07-18 11 views
2

私は、完全にajaxified(jquery libを使用)し、別のasp.netコールバックページを呼び出してサーバーにデータを取得/ポストするasp.netページを使用しています。 JSONオブジェクトをシリアル化すると、次のエラーを経験して、私のページの 一部のユーザーがajax asp.netコールバックページを呼び出す際にjsonオブジェクトをシリアライズ

タイプ...オブジェクト型の オブジェクトをデシリアライズするときにエラーが発生しました

は...無効 のutf8バイトに含まれてい

$.ajax({ 
    type: "POST", 
    async: false, 
    url: 'AjaxCallbacks.aspx?Action=' + actionCode, 
    data: { 
     objectToSerialize: JSON.stringify(obj, null, 2) 
    }, 
    dataType: "json", 
    success: function(operationResult) { 
     //handle success 
    }, 
    error: function(xhttp, textStatus, errorThrown) { 
     //handle error 
    } 
}); 

これに対処するために、私は "contentType"オプションを追加しました...

$.ajax({ 
    type: "POST", 
    async: false, 
    url: 'AjaxCallbacks.aspx?Action=' + actionCode, 
    data: { 
     objectToSerialize: JSON.stringify(obj, null, 2) 
    }, 
    contentType: 'application/json; charset=utf-8', //<-- added to deal with deserializing error 
    dataType: "json", 
    success: function(operationResult) { 
     //handle success 
    }, 
    error: function(xhttp, textStatus, errorThrown) { 
     //handle error 
    } 
}); 

しかし、私はこのようなオブジェクトをサーバー側で読むことはできませんd前:

string objectJson = Request.Params["objectToSerialize"].ToString(); 

「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが発生しました。

アイデア?

+0

投稿パラメータがサーバに渡されたことを確認できますか? Firebugを使用して多分チェックしてください。 – xandy

+0

ここに私のポストタブ(firebug)で見つけたもののサンプルがありますobjectToSerialize =%7B%0A ++%22Id%22%3A +%22846%22%2C%0A ++ 22 22FolderId%22%3A +%22405%22%2C%0A ++ Paramsタブ(firebug)には、私が投稿していると思ったアクションコードだけが含まれています。サーバ上のparamリストからこのjsonオブジェクトにアクセスすることはできません。フォームのコレクションでは、まだそれを得る方法がわからない。 – krul

+0

私はRequest.InputStreamを読んでいると思う? – krul

答えて

2

リクエストを送信するときにContent-Typeヘッダーとしてapplication/jsonを使用しているため、サーバー側では、ASP.NETが要求を入力するときにフォームのポスティングとしてデータが到着すると想定しているためです(NullReferenceException)オブジェクトなので、objectToSerializeパラメータは含まれません。

contentType: 'application/x-www-form-urlencoded; charset=utf-8' 

それともapplication/jsonに固執して、手動で要求ストリームを読み込み、パース:あなたは代わりに以下を試すことができます 私はContentTypeをサーバが考えて変化するので:ここ

using (var reader = new StreamReader(Request.InputStream)) 
{ 
    var input = reader.ReadToEnd(); 
    var objectToSerialize = input.Split('=')[1]; 
} 
0

は、私は私の問題を解決する方法でありますそのデータはフォームコレクションに入っていなければなりません。代わりにrequest.inputstreamから来ていますので、&のコードを読み込み、残りのコードは変更されていません。

/// <summary> 
    /// reads request input stream and decodes it so it can be deserialized to .net object 
    /// </summary> 
    /// <returns>decoded request input stream</returns> 
    private string GetInputStream() 
    { 
    string inputContent; 
    using (var sr = new System.IO.StreamReader(Request.InputStream)) 
     inputContent = sr.ReadToEnd(); 

    return Server.UrlDecode(inputContent); 
    } 

これまでのところこれが機能します。

鉱山(2点)に似た回答がありましたが、それがないとデコードが行えず、.netオブジェクトへのシリアル化が機能しないことが分かりました。 また、 "jsonObjectName ="の文字列をGetInputStream()から取り除いて、ストリームオブジェクトを直列化して.netオブジェクトにシリアライドします。

関連する問題