亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

ASP.NET MVC中的Json Binding和Validate

系統 1984 0

引子:電子商務網站支付功能頁面往往會有很多信息,對于這些信息的保存,往往是分步完成的,那么使用Ajax最合適不過了,比如其中的收貨人信息模塊。這些信息的新建和編輯保存都是用Ajax來完成的。那么有幾種方式完成這個操作呢,我想到如下幾種。
先來看看該功能的截圖:

ASP.NET MVC中的Json Binding和Validate
一般情況下這些信息會對應一個實體類,就命名為:ReceiverInfo,簡單起見,我定義ReceiverInfo如下:

ASP.NET MVC中的Json Binding和Validate

1、將需要的值拼接成json文本,再Action里面處理

?

首先您需要將要保存的值拼接成一個json文本,類似:

var test = "{ ReceiverId: 5, ReceiverName: 'will', Sex: 'F', CreateDate: '2011-02-21' }";

然后用Jquery保存到數據庫,代碼如下:


$.ajax({
??? url: "/Home/test1",
??? type: "post",
??? cache: false,
??? data: test
});

然后您在Action里面這樣操作:

StreamReader reader = new StreamReader(Request.InputStream);
string bodyText = reader.ReadToEnd();
JavaScriptSerializer js = new JavaScriptSerializer();
ReceiverInfo receiver = js.DeserializeReceiverInfo>(bodyText);
//保存。。。

2、利用自定義的ModelBinder實現


JsonBinder

1 public class JsonBinderT> : IModelBinder
2 {
3???? public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
4???? {
5???????? StreamReader reader = new StreamReader(controllerContext.HttpContext.Request.InputStream);
6???????? string json = reader.ReadToEnd();
7
8???????? if (string.IsNullOrEmpty(json))
9???????????? return json;
10
11???????? JavaScriptSerializer serializer = new JavaScriptSerializer();
12???????? object jsonData = serializer.DeserializeObject(json);
13???????? return serializer.DeserializeT>(json);
14???? }
15 }


我們繼承IModelBinder接口,實現其方法:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)

即可。我們可以在Action里面這樣使用:


public ActionResult Test1([ModelBinder(typeof(JsonBinderReceiverInfo>))] ReceiverInfo receiverInfo)

這樣我們自定義的IModelBinder就會取代DefaultModelBinder完成數據綁定。

3、直接傳遞一個Json對象

?

上面兩種方法并沒有利用MVC的System.ComponentModel.DataAnnotations進行有效的數據驗證。您可能需要自己手動驗證,無疑增加了工作量。

我們試試這種方式。

前端的寫法:

var b = {
??? ReceiverId: 5,
??? ReceiverName: "will",
??? Sex: "F",
??? CreateDate: "2011-02-21"
};
$.ajax({
??? url: "/Home/test1",
??? type: "post",
??? cache: false,
??? data: b,
??? success: function(data) { alert(data.message); },
??? error: function(xhr, a, b) { alert(xhr.responseText); }
});


Action的寫法:


public ActionResult Test1(ReceiverInfo receiverInfo)

我們能正常的得到綁定后的數據。而且我們還能利用System.ComponentModel.DataAnnotations進行數據驗證。我們為ReceiverInfo做如下改動:


[System.ComponentModel.DataAnnotations.Required(ErrorMessage = "收貨人必須填寫")]
public string ReceiverName { get; set; }

并在前端為ReceiverName賦值為空字符串,再次執行,得到提示:

ASP.NET MVC中的Json Binding和Validate


很好,不過我們有新的要求了,那就是傳遞更復雜的對象,比如對象套嵌對象,對象有集合屬性,這種方式不能勝任了。


4、利用MvcFutures的JsonValueProviderFactory


每一版的MVC都有一個MvcFutures,里面會有一些額外的功能,這些功能有些會加入下一個版本中,而這些功能在某些時候很有用處。我查看了里面的類,發現有一個類JsonValueProviderFactory正是處理復雜對象的提交和數據驗證。由于json對象需要特定解析才能使用默認的DefaultModelBinder,而這個解析過程需要在ValueProvider階段完成,所以需要實現特定的ValueProvider給DefaultModelBinder。我們需要實現一個ValueProviderFactory和IValueProvider,而MVC里面的DictionaryValueProvider(繼承了IValueProvider)已經足夠使用了,所以只需要繼承ValueProviderFactory實現其方法:public override IValueProvider GetValueProvider(ControllerContext controllerContext)即可,具體代碼您可以看JsonValueProviderFactory。

我們定義另一個類:

ReceiverInfoChild

public class ReceiverInfoChild
{
??? [System.ComponentModel.DataAnnotations.Required(ErrorMessage = "ChildId必須填寫")]
??? public string ChildId { get; set; }
}


并為類ReceiverInfo增加一個屬性public List ReceiverInfoChild { get; set; }
我們把JsonValueProviderFactory拿出來放在項目里面,然后在Global.asax里面注冊一下,就可以使用了。


protected void Application_Start()
{
??? AreaRegistration.RegisterAllAreas();

??? RegisterRoutes(RouteTable.Routes);

??? ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());
}


因為JsonValueProviderFactory中有:if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))來判斷進來的請求是不是json對象,所以我們提交數據的時候需要這樣寫:


var ReceiverInfo = [
??????????? {
??????????????? ReceiverInfoChild: [{ ChildId: "1" }, { ChildId: "11"}],
??????????????? ReceiverId: 5,
??????????????? ReceiverName: "will",
??????????????? Sex: "F",
??????????????? CreateDate: "2011-02-21"
??????????? },
??????????? {
??????????????? ReceiverInfoChild: [{ ChildId: "2" }, { ChildId: "22"}],
??????????????? ReceiverId: 5,
??????????????? ReceiverName: "will",
??????????????? Sex: "F",
??????????????? CreateDate: "2011-02-21"
??????????? }
??????????? ];
$.ajax({
??? url: "/Home/test1",
??? type: "post",
??? cache: false,
??? contentType: "application/json;charset=utf-8",
??? data: JSON.stringify(ReceiverInfo),
??? success: function(data) { alert(data.message); },
??? error: function(xhr, a, b) { alert(xhr.responseText); }
});


其中JSON.stringify(ReceiverInfo)是將json對象轉換成字符串,您可以到 這里 下載該類庫。

在Action里面,我們這樣寫就可以了:


public ActionResult Test1(ListReceiverInfo> receiverInfo)

看一下調試的結果:

ASP.NET MVC中的Json Binding和Validate

完全正常綁定了值。我們再看看數據驗證:

ASP.NET MVC中的Json Binding和Validate

至此,我們實驗了四種方案:

第一種方案,最麻煩,而且容易出錯(可能跟我個人不喜歡拼接字符串有關系);

第二種方案,有一定的通用性,但是不利于數據驗證;

第三種方案,通用,可以進行有效的數據驗證,應對一般的需求夠用了,但是處理更復雜的對象不行;

第四種方案,幾乎可以處理我們遇到的所有情況

另外,這是在ASP.NET MVC2中的使用,到了ASP.NET MVC3,微軟已經把JsonValueProviderFactory作為內置的功能了。

ASP.NET MVC中的Json Binding和Validate


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 这里只有精品视频在线 | 伊人色综合网一区二区三区 | 97影院2| 久久视频精品36线视频在线观看 | 日韩精品中文字幕视频一区 | 色综合合久久天天综合绕视看 | 免费看欧美一级特黄a大片 免费看欧美一级特黄a大片一 | 亚洲精品欧美精品国产精品 | 欧美一区二区三区免费视频 | 国产免费久久精品44 | 亚洲精品久久久久久久久久久网站 | 久久久国产成人精品 | 天天综合网天天综合色不卡 | 国产精品短篇二区 | 亚洲 欧美 日韩在线综合福利 | 亚洲精品欧美精品一区二区 | 久久久久女人精品毛片九一 | 干天天 | 99久久精品国产高清一区二区 | 日韩成人免费在线视频 | 国内精品区一区二区三 | 视频一区二区在线 | 狠狠色噜噜狠狠狠狠网站视频 | 欧美操片在线观看 | 久久九色综合九色99伊人 | 欧美日韩国产在线观看 | 老妇女人一级毛片 | 久久精品视频3 | 深夜网站在线 | 草久在线播放 | 亚洲人人爱| 国产一区二区不卡视频 | 精品国产一区二区麻豆 | 国产成人精品视频免费 | 欧美精品一区二区三区久久 | 中文字幕国产在线 | 色视频久久 | 五月桃花网婷婷亚洲综合 | 午夜91| 福利社看片 | 一级片在线观看免费 |