日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
如何利用ASP.NETMVC保存電子商務(wù)網(wǎng)站用戶信息

電子商務(wù)網(wǎng)站支付功能頁(yè)面往往會(huì)有很多信息,對(duì)于這些信息的保存,往往是分步完成的,那么使用Ajax最合適不過(guò)了,比如其中的收貨人信息模塊。這些信息的新建和編輯保存都是用Ajax來(lái)完成的。那么有幾種方式完成這個(gè)操作呢,我想到如下幾種。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),嵐縣企業(yè)網(wǎng)站建設(shè),嵐縣品牌網(wǎng)站建設(shè),網(wǎng)站定制,嵐縣網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,嵐縣網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

先來(lái)看看該功能的截圖:

一般情況下這些信息會(huì)對(duì)應(yīng)一個(gè)實(shí)體類,就命名為:ReceiverInfo,簡(jiǎn)單起見(jiàn),我定義ReceiverInfo如下:

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

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

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

然后用Jquery保存到數(shù)據(jù)庫(kù),代碼如下:

 
 
 
 
  1. $.ajax({   
  2. url: "/Home/test1",   
  3. type: "post",   
  4. cache: false,   
  5. data: test});

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

 
 
 
 
  1. StreamReader reader = new StreamReader(Request.InputStream);
  2. string bodyText = reader.ReadToEnd();
  3. JavaScriptSerializer js = new JavaScriptSerializer();
  4. ReceiverInfo receiver = js.Deserialize(bodyText);
  5. //保存。。。

2、利用自定義的ModelBinder實(shí)現(xiàn)

JsonBinder

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

我們繼承IModelBinder接口,實(shí)現(xiàn)其 方法:

 
 
 
 
  1. public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)

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

 
 
 
 
  1. public ActionResult Test1([ModelBinder(typeof(JsonBinder))] ReceiverInfo receiverInfo)

這樣我們自定義的 IModelBinder就會(huì)取代DefaultModelBinder完成數(shù)據(jù)綁定。

3、直接傳遞一個(gè)Json對(duì)象

上面兩種方法并沒(méi)有利用MVC的System.ComponentModel.DataAnnotations進(jìn)行有效的數(shù)據(jù)驗(yàn)證。您可能需要自己手動(dòng)驗(yàn)證,無(wú)疑增加了工作量。

我們?cè)囋囘@種方式。

前端的寫(xiě)法

 
 
 
 
  1. var b = {    
  2. ReceiverId: 5,    
  3. ReceiverName: "will",    
  4. Sex: "F",    
  5. CreateDate: "2011-02-21"};$.ajax({   
  6. url: "/Home/test1",    
  7. type: "post",    
  8. cache: false,    
  9. data: b,    
  10. success: function(data) { alert(data.message); },    
  11. error: function(xhr, a, b) { alert
  12. (xhr.responseText); }});

Action的寫(xiě)法:

 
 
 
 
  1. public ActionResult Test1(ReceiverInfo receiverInfo)

我們能正常的得到綁定后的數(shù)據(jù)。而且我們還能利用System.ComponentModel.DataAnnotations進(jìn)行數(shù)據(jù)驗(yàn)證。我們?yōu)镽eceiverInfo做如下改動(dòng):

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

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

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

4、利用MvcFutures的JsonValueProviderFactory

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

我們定義另一個(gè)類:

ReceiverInfoChild

 
 
 
 
  1. public class ReceiverInfoChild{    
  2. [System.ComponentModel.DataAnnotations.Required
  3. (ErrorMessage = "ChildId必須填寫(xiě)")]    
  4. public string ChildId { get; set; }}

并為類ReceiverInfo增加一個(gè)屬性public List ReceiverInfoChild { get; set; }

我們把JsonValueProviderFactory拿出來(lái)放在項(xiàng)目里面,然后在Global.asax里面注冊(cè)一下,就可以使用了。

 
 
 
 
  1. protected void Application_Start(){    
  2. AreaRegistration.RegisterAllAreas();    
  3. RegisterRoutes(RouteTable.Routes);    
  4. ValueProviderFactories.Factories.Add(new 
  5. JsonValueProviderFactory());}

因?yàn)镴sonValueProviderFactory中有:if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))來(lái)判斷進(jìn)來(lái)的請(qǐng)求是不是json對(duì)象,所以我們提交數(shù)據(jù)的時(shí)候需要這樣寫(xiě):

 
 
 
 
  1. var ReceiverInfo = [            
  2. {                
  3. ReceiverInfoChild: [{ ChildId: "1" }, { ChildId: "11"}],                
  4. ReceiverId: 5,               
  5. ReceiverName: "will",               
  6. Sex: "F",                
  7. CreateDate: "2011-02-21"          
  8.   },            
  9. {               
  10.  ReceiverInfoChild: [{ ChildId: "2" }, { ChildId: "22"}],                
  11. ReceiverId: 5,               
  12. ReceiverName: "will",               
  13. Sex: "F",                
  14. CreateDate: "2011-02-21"            }           
  15.  ];$.ajax({   
  16. url: "/Home/test1",   
  17. type: "post",   
  18. cache: false,   
  19. contentType: "application/json;charset=utf-8",   
  20. data: JSON.stringify(ReceiverInfo),   
  21. success: function(data) { alert(data.message); },  
  22.  error: function(xhr, a, b) { alert(xhr.responseText); }});

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

在Action里面,我們這樣寫(xiě)就可以了:

 
 
 
 
  1. public ActionResult Test1(List receiverInfo)

看一下調(diào)試的結(jié)果:

完全正常綁定了值。我們?cè)倏纯磾?shù)據(jù)驗(yàn)證:

至此,我們實(shí)驗(yàn)了四種方案:

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

第二種方案,有一定的通用性,但是不利于數(shù)據(jù)驗(yàn)證;

第三種方案,通用,可以進(jìn)行有效的數(shù)據(jù)驗(yàn)證,應(yīng)對(duì)一般的需求夠用了,但是處理更復(fù)雜的對(duì)象不行;

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

另外,這是在ASP.NET MVC2中的使用,到了ASP.NET MVC3,微軟已經(jīng)把JsonValueProviderFactory作為內(nèi)置的功能了。


網(wǎng)頁(yè)名稱:如何利用ASP.NETMVC保存電子商務(wù)網(wǎng)站用戶信息
網(wǎng)站路徑:http://www.dlmjj.cn/article/dpiheoj.html