MVC学习系列——ModelBinder扩展

在MVC系统中,我们接受数据,运用的是ModelBinder 的技术。

MVC学习系列——ActionResult扩展在这个系列中,我们自定义了XmlResult的返回结果。

那么是不是意味着能POST一个XML数据类型给我们项目,这样的话,我们需要自定义一个XmlModelBinder来接受XML数据。

新建XmlModelBinder,继承于:IModelBinder

 1 public class XmlModelBinder : IModelBinder
 2     {
 3         public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
 4         {
 5             try
 6             {
 7                 var modelType = bindingContext.ModelType;
 8                 var serializer = new XmlSerializer(modelType);
 9                 var inputStream = controllerContext.HttpContext.Request.InputStream;
10                 return serializer.Deserialize(inputStream);
11             }
12             catch (Exception)
13             {
14                 throw;
15             }
16         }
17     }

在HomeController的PostXmlStudent中,运用:

1  public XmlResult PostXmlStudent([ModelBinder(typeof(XmlModelBinder))]StudentViewModel viewModel)
2         {
3             viewModel.Name = "Result";
4             //再次以XML的形式,返回结果
5             return new XmlResult(viewModel);
6         }

用Fiddler模拟一个以XML数据POST的请求

接受数据:

因为viewModel.Name = "Result";
所以,在Fiddler中查看返回数据:

就这样,简单实现了:能够接收XML数据结构的功能

但是,这样做带来一个问题,就是每次需要XML的时候,就得加上[ModelBinder(typeof(XmlModelBinder))]这段代码,很是麻烦。

那么问题来了:MVC能不能自动识别。这个问题的答案是肯定的。

新建XmlModelBinderProvider,继承接口IModelBinderProvider

 1 public class XmlModelBinderProvider : IModelBinderProvider
 2     {
 3         public IModelBinder GetBinder(Type modelType)
 4         {
 5             var contentType = HttpContext.Current.Request.ContentType.ToLower();
 6
 7             //如果不是Text/Xml,就返回null
 8             if (contentType!="text/xml")
 9             {
10                 return null;
11             }
12
13             return new XmlModelBinder();
14         }
15     }

同时要注意的是:在Global类中,得注入。

 1  protected void Application_Start()
 2         {
 3             AreaRegistration.RegisterAllAreas();
 4             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
 5             RouteConfig.RegisterRoutes(RouteTable.Routes);
 6             BundleConfig.RegisterBundles(BundleTable.Bundles);
 7
 8             //加载配置文件
 9             var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "Log4Net.config");
10             XmlConfigurator.ConfigureAndWatch(logCfg);
11
12             //XmlModelBinderProvider注入ModelBinderProviders
13             ModelBinderProviders.BinderProviders.Insert(0, new XmlModelBinderProvider());
14         }

新建一个Action,PostXmlStudent_Auto,特殊的是,没有用ModelBinder

1  public XmlResult PostXmlStudent_Auto(StudentViewModel viewModel)
2         {
3             viewModel.Name = "PostXmlStudent_Auto";
4             //再次以XML的形式,返回结果
5             return new XmlResult(viewModel);
6         }

用fiddle进行模拟请求:

接受数据:

因为 viewModel.Name = "PostXmlStudent_Auto";
,所以fiddle返回数据:

时间: 2024-10-12 22:04:55

MVC学习系列——ModelBinder扩展的相关文章

MVC学习系列——Filter扩展

在MVC中,Filter也是可以扩展的.在此,本人对Filter的理解就是AOP,不知道各位大侠,有什么高的见解,呵呵... 首先MVC四大过滤神器IAuthorizationFilter,IActionFilter,IResultFilter,IExceptionFilter. 在此之前,我们先安装Log4net日志神器: 看下项目的引用 配置文件 1 <?xml version="1.0" encoding="utf-8"?> 2 <confi

ASP.NET MVC学习系列(二)-WebAPI请求

继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax({type:"get"}) 来实现: 请求的后台Action方法仍为上篇文章中的GetU

ASP.NET MVC学习系列(二)-WebAPI请求(转)

转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax

MVC学习系列14--Bundling And Minification【捆绑和压缩】--翻译国外大牛的文章

这个系列是,基础学习系列的最后一部分,这里,我打算翻译一篇国外的技术文章结束这个基础部分的学习:后面打算继续写深入学习MVC系列的文章,之所以要写博客,我个人觉得,做技术的,首先得要懂得分享,说不定你自己以为正确的东西,存在瑕疵,分享出来,大家也可以互相进步.这样整个生态圈也会越来越好.不是么?   好了,闲话扯远了,下面开始正题吧,一下是英文和中文对照,翻译的不好,请见谅. This article introduces how to improve ASP.NET MVC Applicati

MVC 学习系列

总是很难说清MVC的概念,即使读了源代码后(读的时候有些东西,理解起来还是有点吃力),也依然能难对整体的每一个具体的原理说的一清二楚.为了达到自己学习的目的,我把自己的学习路线写成文章,一边自己能对MVC有深刻的认识. 尽管也看了一些关于MVC的书籍,但还是很难分清MVP,MVVM,MVC的概念区分,先抛弃之前的概念的区分,先体验后在总结吧. MVC文章系列: 1,)mvc controller控制器

MVC学习系列——Model验证扩展

MVC中,实现了前端后端的验证. 前端验证.步骤: web.config这两个得开启: <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> JS设置 第一步:引入页面js @Scripts.Render("~/bundles/jque

ASP.NET MVC学习系列(一)-WebAPI初探

由于即将要接手的新项目计划用ASP.NET MVC3来开发,所以最近一段时间一直在看相关的书或文章.因为之前在大学里也曾学习过MVC2开发,也做过几个简单的MVC2的小型测试项目,不过在后来工作以后主要还是开发WebForm的项目,所以MVC的东西也就逐渐的淡忘了. 经过这一段时间的系统学习,真的觉得MVC3相比于之前的MVC2还有WebForm来说,确实有一种让人欲罢不能爽歪歪的感觉.特别是Razor语法.Linq表达式等的结合运用. 为了将学习过程中遇到的一些值得留意的问题和知识点进行一个很

MVC学习系列5--Layout布局页和RenderSection的使用

我们开发网站项目的时候,都会遇到这样的问题:就是页面怎么统一风格,有一致的外观,在之前ASP.NET的时代,我们有两种选择,一个是使用MasterPage页,一个是手动,自己在每个页面写CSS样式,但这样代码量太大了..不可取,那么到了ASP.NET MVC时代,有什么技术可以统一页面风格呢???有,那就是Layout布局视图.下面就开始学习吧. 1. 首先使用空模板,新建一个MVC Web项目: 新建完成之后,初始化状态是: 2.接着在根目录[LayoutMVC这里是]下,新建一个文件夹[Co

MVC学习系列[email&#160;protected]辅助方法和用户自定义HTML方法

在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类,分成三个类型: Inline HTML helpers[内联的HTML帮助类,例如@Html.Label等] Built-in HTML helpers[也就是嵌套的HTML帮助类,即@helper辅助方法] Custom HTML helpers[自定义的HTML帮助类] 在这里,我们学习第二种,