最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用jQuery向asp.net Mvc傳遞復(fù)雜json數(shù)據(jù)-ModelBinder篇

 更新時(shí)間:2010年05月07日 22:26:13   作者:  
jQuery提供的ajax方法能很方便的實(shí)現(xiàn)客戶端與服務(wù)器的異步交互,在asp.net mvc 框架使用jQuery能很方便地異步獲取提交數(shù)據(jù),給用戶提供更好的體驗(yàn)!
調(diào)用jQuery的ajax方法時(shí),jQuery會(huì)根據(jù)post或者get協(xié)議對(duì)參數(shù)data進(jìn)行序列化;

如果提交的數(shù)據(jù)使用復(fù)雜的json數(shù)據(jù),例如:

{userId:32323,userName:{firstName:"李",lastName:"李大嘴"}}

那么服務(wù)器是無(wú)法正常接收到完整的參數(shù),因?yàn)閖Query對(duì)data的序列化,是使用了鍵值對(duì)拼裝的方式;

參數(shù)拼裝成 userId=32323&userName=object ; userName所指向的對(duì)象被序列化成字符串"object"


如何才能把一個(gè)復(fù)雜的object對(duì)象提交到后臺(tái)的action參數(shù)中呢?

首先,解決jQuery對(duì)于參數(shù)序列化的問(wèn)題:
復(fù)制代碼 代碼如下:

/*對(duì)象序列化為字符串*/
String.toSerialize = function(obj) {
var ransferCharForJavascript = function(s) {
var newStr = s.replace(
/[\x26\x27\x3C\x3E\x0D\x0A\x22\x2C\x5C\x00]/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 (var index in obj) {
if (typeof obj[index] == "function") continue;
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("{");
var index = 0;
for (var key in obj) {
if (typeof obj[key] == "function") continue;
if (index > 0) builder.push(",");
builder.push(String.format("\"{0}\":{1}", key, String.toSerialize(obj[key])));
index++;
}
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 != undefined) {
return String.toSerialize(obj);
}
}


jQuery異步請(qǐng)求:
復(fù)制代碼 代碼如下:

$(function() {
/*按鈕點(diǎn)擊事件*/
$("#btn_post_test").click(function() {
var data = [
{ UserId: "11", UserName: { FirstName: "323", LastName: "2323" }, Keys: ["xiaoming", "xiaohong"] },
{ UserId: "22", UserName: { FirstName: "323", LastName: "2323" }, Keys: ["xiaoming", "xiaohong"] },
{ UserId: "33", UserName: { FirstName: "323", LastName: "2323" }, Keys: ["xiaoming", "xiaohong"] }
];
$.post("Home/Test", { users: String.toSerialize(data) }, function(text) {
alert(String.toSerialize(text));
}, "json");
});
});

點(diǎn)擊按鈕提交數(shù)據(jù),監(jiān)控瀏覽器,可以發(fā)現(xiàn)提交的數(shù)據(jù)是json對(duì)象的序列化后的內(nèi)容:
復(fù)制代碼 代碼如下:

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
User-Agent: Mozilla/4.0 (compatible; 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)
Host: localhost:3149
Content-Length: 501
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: CookieGlobalLoginUserID=16063
users=%5B%7B%22UserId%22%3A%2211%22%2C%22Name%22%3A%7B%22FirstName%22%3A%22323%22%2C%22LastName%22%3A%222323%22%7D%2C%22Keys%22%3A%5B%22xiaoming%22%2C%22xiaohong%22%5D%7D%2C%7B%22UserId%22%3A%2222%22%2C%22Name%22%3A%7B%22FirstName%22%3A%22323%22%2C%22LastName%22%3A%222323%22%7D%2C%22Keys%22%3A%5B%22xiaoming%22%2C%22xiaohong%22%5D%7D%2C%7B%22UserId%22%3A%2233%22%2C%22Name%22%3A%7B%22FirstName%22%3A%22323%22%2C%22LastName%22%3A%222323%22%7D%2C%22Keys%22%3A%5B%22xiaoming%22%2C%22xiaohong%22%5D%7D%5D

其次,后臺(tái)服務(wù)器處理參數(shù)綁定:
復(fù)制代碼 代碼如下:

using System.Collections.Generic;
using System.Web.Mvc;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace WebOS.Controllers
{
[HandleError]
public class HomeController : Controller
{
/// <summary>
/// 測(cè)試方法
/// </summary>
/// <param name="users">用戶數(shù)據(jù)</param>
/// <returns>提交的用戶數(shù)組</returns>
public ActionResult Test([ModelBinder(typeof(JsonBinder<User>))]List<User> users)
{
return Json(users, JsonRequestBehavior.AllowGet);
}
}
/// <summary>
/// 對(duì)象實(shí)體
/// </summary>
[JsonObject]
public class User
{
[JsonProperty("UserName")]
public UserName Name { get; set; }
[JsonProperty("UserId")]
public string UserId { get; set; }
[JsonProperty("Keys")]
public List<string> Keys { get; set; }
}
/// <summary>
/// 對(duì)象實(shí)體
/// </summary>
[JsonObject]
public class UserName
{
[JsonProperty("FirstName")]
public string FirstName { get; set; }
[JsonProperty("LastName")]
public string LastName { get; set; }
}
/// <summary>
/// Json數(shù)據(jù)綁定類
/// </summary>
/// <typeparam name="T"></typeparam>
public class JsonBinder<T> : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
//從請(qǐng)求中獲取提交的參數(shù)數(shù)據(jù)
var json = controllerContext.HttpContext.Request.Form[bindingContext.ModelName] as string;
//提交參數(shù)是對(duì)象
if (json.StartsWith("{") && json.EndsWith("}"))
{
JObject jsonBody = JObject.Parse(json);
JsonSerializer js = new JsonSerializer();
object obj = js.Deserialize(jsonBody.CreateReader(), typeof(T));
return obj;
}
//提交參數(shù)是數(shù)組
if (json.StartsWith("[") && json.EndsWith("]"))
{
IList<T> list = new List<T>();
JArray jsonRsp = JArray.Parse(json);
if (jsonRsp != null)
{
for (int i = 0; i < jsonRsp.Count; i++)
{
JsonSerializer js = new JsonSerializer();
object obj = js.Deserialize(jsonRsp[i].CreateReader(), typeof(T));
list.Add((T)obj);
}
}
return list;
}
return null;
}
}
}

前端獲取到后臺(tái)返回的數(shù)據(jù),結(jié)果就是用戶提交的數(shù)據(jù):

后臺(tái)json反序列化使用了Newtonsoft.Json 組件,有關(guān)資料請(qǐng)參考:http://james.newtonking.com/

相關(guān)文章

  • Jquery的autocomplete插件用法及參數(shù)講解

    Jquery的autocomplete插件用法及參數(shù)講解

    今天小編就為大家分享一篇關(guān)于Jquery的autocomplete插件用法及參數(shù)講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • jquery取消選擇select下拉框示例代碼

    jquery取消選擇select下拉框示例代碼

    本篇文章主要是對(duì)jquery取消選擇select下拉框示例代碼進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2014-02-02
  • 最新評(píng)論

    博罗县| 栾城县| 昔阳县| 丽江市| 郯城县| 红桥区| 朝阳市| 娱乐| 太湖县| 吴桥县| 中方县| 枣庄市| 淮安市| 金华市| 德保县| 塘沽区| 龙岩市| 越西县| 油尖旺区| 锡林郭勒盟| 滕州市| 辰溪县| 西和县| 宣武区| 马山县| 舒城县| 新巴尔虎右旗| 金阳县| 衡阳市| 道真| 五指山市| 理塘县| 大城县| 南岸区| 西藏| 麻栗坡县| 合水县| 吉木萨尔县| 文山县| 丘北县| 海城市|