问题描述
为了使读取的JSON字符串转换为查询对象,用了JsonModelBinder方法:publicclassJsonModelBinder:IModelBinder{publicobjectBindModel(ControllerContextcontrollerContext,ModelBindingContextbindingContext){if(controllerContext!=null&&bindingContext!=null){varserializer=newDataContractJsonSerializer(bindingContext.ModelType);returnserializer.ReadObject(controllerContext.HttpContext.Request.InputStream);}returnnull;}}
页面段的提交方法为:varjsonData=JSON.stringify({"SelectCategoryId":selectCategory,"CurrentPage":page,"StartTime":startTime,"EndTime":entTime});$.ajax({url:"/Home/SearchTrainingByAjax",data:jsonData,type:"POST",dataType:"json",contentType:"application/json;charset=utf-8",success:function(date){alert(“success”);}});
对应的Acion为:[AcceptVerbs(HttpVerbs.Post)]publicJsonResultSearchTrainingByAjax(JsonTrainingSearchRequestrequest){returnJson(request);}
JsonTrainingSearchRequest类定义为:[ModelBinder(typeof(JsonModelBinder))]publicclassJsonTrainingSearchRequest{publicintSelectCategoryId{get;set;}publicintCurrentPage{get;set;}publicDateTimeStartTime{get;set;}publicDateTimeEndTime{get;set;}}
但在JsonModelBinder方法中controllerContext.HttpContext.Request.InputStream读取到的参数总是空啊!怎么回事呢?弄了一周了都没弄出来,能试的方法都试了。大家给看看啊补充一张执行Ajax时提交的json字符串图
解决方案
本帖最后由 woshimaikou 于 2013-12-31 23:08:07 编辑
解决方案二:
不需要用modelbinder,请求的内容类型是json的时候,框架自然会反序列化。
解决方案三:
SelectCategoryId是字符串
解决方案四:
引用1楼KarasCanvas的回复:
不需要用modelbinder,请求的内容类型是json的时候,框架自然会反序列化。
你的意思我把 JsonModelBinder这个类直接去掉就可以了吗?
解决方案五:
引用2楼caozhy的回复:
SelectCategoryId是字符串
是啊JSON.stringify({ "SelectCategoryId": selectCategory, "CurrentPage": page, "StartTime": startTime, "EndTime": entTime }); 这个后的结果
解决方案六:
蹭个分参考
解决方案七:
直接这样反序列化就可以了varjson=newDataContractJsonSerializer(typeof(JsonTrainingSearchRequest));vartraining=(JsonTrainingSearchRequest)json.ReadObject(Request.InputStream);returntraining;//当然JsonTrainingSearchRequest要加上[Serializable]属性