ホームページ  >  記事  >  ウェブフロントエンド  >  jQuery を使用して複雑な json データを asp.net Mvc に渡す - ModelBinder_jquery

jQuery を使用して複雑な json データを asp.net Mvc に渡す - ModelBinder_jquery

WBOY
WBOYオリジナル
2016-05-16 18:27:551675ブラウズ

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 非同期リクエスト:



コードをコピー


コードは次のとおりです。
$(function() { /*ボタンクリックイベント*/ $("#btn_post_test").click(function() { var data = [ { ユーザー ID: "11"、ユーザー名: { 名: "323"、姓: "2323" }、キー: ["xiaoming"、"xiaohong"] }、
{ ユーザー 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 オブジェクトのシリアル化されたコンテンツであることがわかります。




コードをコピー

コード
POST /Home/Test HTTP/1.1 x-requested-with: XMLHttpRequest Accept-Language: zh-cn Referer: http:// localhost:3149/test.html Accept: application/json, text/javascript, */* Content-Type: application/x-www-form-urlencoded
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/
を参照してください。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。