jQuery の ajax メソッドを呼び出すと、jQuery は post または get プロトコルに従ってパラメータ データをシリアル化します。
送信されたデータが複雑な json データを使用する場合、たとえば、
{userId:32323, userName :{firstName:"李",lastName:"李大口"}}
jQuery はキーと値のペアのアセンブリを使用してデータをシリアル化するため、
メソッドを使用して完全なパラメーターを受け取ることができません。
パラメータは userId=32323&userName=object に組み立てられ、userName が指すオブジェクトは文字列 "object" にシリアル化されます。
複雑なオブジェクトを送信する方法 アクション パラメータについてはどうすればよいですか
まず、パラメーターのシリアル化に関する jQuery の問題を解決します。
/*文字列にシリアル化されたオブジェクト*/
String.toSerialize = function(obj) {
var ransferCharForJavascript = function(s) {
var newStr = s.replace (
/[x26x27x3Cx3Ex0Dx0Ax22x2Cx5Cx00]/g,
function(c) {
ascii = c.charCodeAt(0)
return '\u00' (ascii < 16 ? '0 ' ascii.toString (16) : ascii.toString(16))
}
);
return newStr;
}
if (obj == null) {
return null
}
else if (obj.constructor == Array) {
var builder = [];
builder.push("[");
for (obj の var インデックス) {
if (typeof obj[index] == "関数") 続行;
if (index > 0) builder.push(",");
builder.push(String.toSerialize(obj[index])) ;
}
builder.push("]");
return builder.join("");
else if (obj.constructor == Object) {
var builder = [];
builder.push("{");
for (obj の var key) {
if (typeof obj[key] == " function") continue;
if (index > 0) builder.push(",");
builder.push(String.format(""{0}":{1}" , key, String .toSerialize(obj[key])));
インデックス ;
builder.push("}");
return builder.join(""); >else if (obj.constructor == Boolean) {
return obj.toString();
}
else if (obj.constructor == Number) {
return obj.toString();
}
else if (obj.constructor == String) {
return String.format('"{0}"', ransferCharForJavascript(obj));
}
else if ( obj.constructor == Date) {
return String.format('{"__DataType":"Date","__thisue":{0}}', obj.getTime() - (new Date( 1970, 0, 1, 0, 0, 0)).getTime());
}
else if (this.toString != unknown) {
return String.toSerialize(obj); >}
jQuery 非同期リクエスト:
コードをコピー
コードは次のとおりです。
{ ユーザー ID: "22"、ユーザー名: { FirstName: "323", LastName: "2323" }, Keys: ["xiaoming", "xiaohong"] },
{ UserId: "33", UserName: { FirstName: "323", LastName: " 2323 " }, キー: ["xiaoming", "xiaohong"] }
];
$.post("Home/Test", { users: String.toSerialize(data) }, function(text) {
alert(String.toSerialize(text));
}, "json"))
});
ボタンをクリックしてデータを送信しますモニター ブラウザーで、送信されたデータが json オブジェクトのシリアル化されたコンテンツであることがわかります。
コードをコピー
コード
Accept-Encoding: gzip, deflate
ユーザー エージェント: Mozilla /4.0 (互換性; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0 ; InfoPath.2; .NET4 .0C; .NET4.0E)
ホスト: localhost:3149
接続: キープアライブ
キャッシュ制御: キャッシュなし
Cookie: CookieGlobalLoginUserID=16063
users=[{"UserId":"11","Name":{"FirstName":"323","LastName":"2323"},"Keys":["シャオミン","シャオホン"] },{"ユーザーID":"22","名前":{"名":"323","姓":"2323"},"キー":["シャオミン","シャオホン"]},{"ユーザーID":"33","名前":{"名":"323","姓":"2323"},"キー":["シャオミン","シャオホン"]} ]
次に、バックグラウンド サーバーがパラメータ バインディングを処理します:
System.Collections.Generic を使用;
System.Web.Mvc を使用;
Newtonsoft.Json.Linq を使用
名前空間
🎜>[HandleError]
public class HomeController : Controller
{
///
/// テストメソッド
/// //
ユーザー データ
///
送信されたユーザー配列 public ActionResult Test([ModelBinder(typeof(JsonBinder
ユーザー)
{
return Json(users, JsonRequestBehavior.AllowGet)
}
}
///
// / オブジェクト エンティティ
///
[JsonObject]
public class User
{
[JsonProperty("UserName")]
public UserName Name { get;セット; }
[JsonProperty("UserId")]
public string UserId { set; }
[JsonProperty("Keys")]
public List ; }
}
///
/// オブジェクト エンティティ
///
パブリック クラス UserName
{
[JsonProperty("FirstName")]
パブリック文字列 FirstName { セット; }
[JsonProperty("LastName")]
パブリック文字列 LastName { セット; }
///
/// Json データ バインディング クラス
///
/// /typeparam>
public class JsonBinder : IModelBinder
{
public object BindModel(ControllerContextcontrollerContext, ModelBindingContext bindingContext)
{
// リクエストから送信されたパラメーター データを取得します
var json =controllerContext.HttpContext.Request.Form[bindingContext.ModelName] as string;
//送信パラメータはオブジェクトです
if (json.StartsWith("{") && json.EndsWith("} " ))
{
JObject jsonBody = JObject.Parse(json);
JsonSerializer js = new JsonSerializer();
object obj = js.Deserialize(jsonBody.CreateReader(), typeof(T) ) );
return obj;
}
//送信パラメータは配列です
if (json.StartsWith("[") && json.EndsWith("]"))
{
IList list = new List();
JArray jsonRsp = JArray.Parse(json);
if (jsonRsp != null)
{
for ( int i = 0; jsonRsp.Count; i )
{
JsonSerializer();
obj = js.Deserialize(jsonRsp[i].CreateReader() T)) ;
list.Add((T)obj);
}
}
return
}
}
}
フロントエンドはバックグラウンドから返されたデータを取得し、その結果がユーザーによって送信されたデータになります。
バックグラウンドの JSON デシリアライズでは Newtonsoft が使用されます。 .Json コンポーネント 関連情報については、
http://james.newtonking.com/
を参照してください。