|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
计算机发展到这个时候,很多技术日益成熟,想学好一种技术都是不容易的,当你学会用的时候你对它的很多原理可能很不了解)<p>电子商务网站付出功效页面常常会有良多信息,关于这些信息的保留,常常是分步完成的,那末利用Ajax最符合不外了,好比个中的收货人信息模块。这些信息的新建和编纂保留都是用Ajax来完成的。那末有几种体例完成这个操纵呢,我想到以下几种。
先来看看该功效的截图:
一样平常情形下这些信息会对应一个实体类,就定名为:ReceiverInfo,复杂起见,我界说ReceiverInfo以下:
1、将必要的值拼接成json文本,再Action内里处置
起首您必要将要保留的值拼接成一个json文本,相似:- vartest="{ReceiverId:5,ReceiverName:"will",Sex:"F",CreateDate:"2011-02-21"}";
复制代码 然后用Jquery保留到数据库,代码以下:- $.ajax({url:"/Home/test1",type:"post",cache:false,data:test});
复制代码 然后您在Action内里如许操纵:- StreamReaderreader=newStreamReader(Request.InputStream);stringbodyText=reader.ReadToEnd();JavaScriptSerializerjs=newJavaScriptSerializer();ReceiverInforeceiver=js.Deserialize<ReceiverInfo>(bodyText);//保留。。。
复制代码 2、使用自界说的ModelBinder完成
JsonBinder- publicclassJsonBinder<T>:IModelBinder{publicobjectBindModel(ControllerContextcontrollerContext,ModelBindingContextbindingContext){StreamReaderreader=newStreamReader(controllerContext.HttpContext.Request.InputStream);stringjson=reader.ReadToEnd();if(string.IsNullOrEmpty(json))returnjson;JavaScriptSerializerserializer=newJavaScriptSerializer();objectjsonData=serializer.DeserializeObject(json);returnserializer.Deserialize<T>(json);}}
复制代码 我们承继IModelBinder接口,完成其办法:- publicobjectBindModel(ControllerContextcontrollerContext,ModelBindingContextbindingContext)
复制代码 便可。我们能够在Action内里如许利用:- publicActionResultTest1([ModelBinder(typeof(JsonBinder<ReceiverInfo>))]ReceiverInforeceiverInfo)
复制代码 如许我们自界说的IModelBinder就会代替DefaultModelBinder完成数据绑定。
3、间接传送一个Json工具
下面两种办法并没有益用MVC的System.ComponentModel.DataAnnotations举行无效的数据考证。您大概必要本人手动考证,无疑增添了事情量。
我们尝尝这类体例。
前真个写法- varb={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的写法:- publicActionResultTest1(ReceiverInforeceiverInfo)
复制代码 我们能一般的失掉绑定后的数据。并且我们还能使用System.ComponentModel.DataAnnotations举行数据考证。我们为ReceiverInfo做以下修改:- [System.ComponentModel.DataAnnotations.Required(ErrorMessage="收货人必需填写")]publicstringReceiverName{get;set;}
复制代码 并在前端为ReceiverName赋值为空字符串,再次实行,失掉提醒:
很好,不外我们有新的请求了,那就是传送更庞大的工具,好比工具套嵌工具,工具有汇合属性,这类体例不克不及胜任了。
4、使用MvcFutures的JsonValueProviderFactory
每版的MVC都有一个MvcFutures,内里会有一些分外的功效,这些功效有些会到场下一个版本中,而这些功效在某些时分很有效处。我检察了内里的类,发明有一个类JsonValueProviderFactory恰是处置庞大工具的提交和数据考证。因为json工具必要特定剖析才干利用默许的DefaultModelBinder,而这个剖析历程必要在ValueProvider阶段完成,以是必要完成特定的ValueProvider给DefaultModelBinder。我们必要完成一个ValueProviderFactory和IValueProvider,而MVC内里的DictionaryValueProvider<TValue>(承继了IValueProvider)已充足利用了,以是只必要承继ValueProviderFactory完成其办法:publicoverrideIValueProviderGetValueProvider(ControllerContextcontrollerContext)便可,详细代码您能够看JsonValueProviderFactory。
我们界说另外一个类:
ReceiverInfoChild- publicclassReceiverInfoChild{[System.ComponentModel.DataAnnotations.Required(ErrorMessage="ChildId必需填写")]publicstringChildId{get;set;}}
复制代码 并为类ReceiverInfo增添一个属性publicList<ReceiverInfoChild>ReceiverInfoChild{get;set;}
我们把JsonValueProviderFactory拿出来放在项目内里,然后在Global.asax内里注册一下,就能够利用了。- $.ajax({url:"/Home/test1",type:"post",cache:false,data:test});0
复制代码 由于JsonValueProviderFactory中有:if(!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json",StringComparison.OrdinalIgnoreCase))来判别出去的哀求是否是json工具,以是我们提交数据的时分必要如许写:- $.ajax({url:"/Home/test1",type:"post",cache:false,data:test});1
复制代码 个中JSON.stringify(ReceiverInfo)是将json工具转换成字符串,您能够到这里下载该类库。
在Action内里,我们如许写就能够了:- $.ajax({url:"/Home/test1",type:"post",cache:false,data:test});2
复制代码 看一下调试的了局:
完整一般绑定了值。我们再看看数据考证:
至此,我们实行了四种计划:
第一种计划,最贫苦,并且简单堕落(大概跟我团体不喜好拼接字符串有干系);
第二种计划,有必定的通用性,可是倒霉于数据考证;
第三种计划,通用,能够举行无效的数据考证,应对一样平常的需求够用了,可是处置更庞大的工具不可;
第四种计划,几近能够处置我们碰到的一切情形
别的,这是在ASP.NETMVC2中的利用,到了ASP.NETMVC3,微软已把JsonValueProviderFactory作为内置的功效了。
原文链接:http://www.ckuyun.com/WillMeng/archive/2011/03/01/json_binding_validate.html
【编纂保举】
来吧!老师们!我代表千千万万的asp.net/C#的初学者在这里呼唤着! |
|