MVC学习系列——ModelBinder扩展
在MVC系统中,我们接受数据,运用的是ModelBinder 的技术。
MVC学习系列——ActionResult扩展在这个系列中,我们自定义了XmlResult的返回结果。
那么是不是意味着能POST一个XML数据类型给我们项目,这样的话,我们需要自定义一个XmlModelBinder来接受XML数据。
新建XmlModelBinder,继承于:IModelBinder
public class XmlModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
try
{
var modelType = bindingContext.ModelType;
var serializer = new XmlSerializer(modelType);
var inputStream = controllerContext.HttpContext.Request.InputStream;
return serializer.Deserialize(inputStream);
}
catch (Exception)
{
throw;
}
}
}
在HomeController的PostXmlStudent中,运用:
public XmlResult PostXmlStudent([ModelBinder(typeof(XmlModelBinder))]StudentViewModel viewModel)
{
viewModel.Name = "Result";
//再次以XML的形式,返回结果
return new XmlResult(viewModel);
}
用Fiddler模拟一个以XML数据POST的请求
接受数据:

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

就这样,简单实现了:能够接收XML数据结构的功能
但是,这样做带来一个问题,就是每次需要XML的时候,就得加上[ModelBinder(typeof(XmlModelBinder))]这段代码,很是麻烦。
那么问题来了:MVC能不能自动识别。这个问题的答案是肯定的。
新建XmlModelBinderProvider,继承接口IModelBinderProvider
public class XmlModelBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(Type modelType)
{
var contentType = HttpContext.Current.Request.ContentType.ToLower(); //如果不是Text/Xml,就返回null
if (contentType!="text/xml")
{
return null;
} return new XmlModelBinder();
}
}
同时要注意的是:在Global类中,得注入。
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles); //加载配置文件
var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "Log4Net.config");
XmlConfigurator.ConfigureAndWatch(logCfg); //XmlModelBinderProvider注入ModelBinderProviders
ModelBinderProviders.BinderProviders.Insert(, new XmlModelBinderProvider());
}
新建一个Action,PostXmlStudent_Auto,特殊的是,没有用ModelBinder
public XmlResult PostXmlStudent_Auto(StudentViewModel viewModel)
{
viewModel.Name = "PostXmlStudent_Auto";
//再次以XML的形式,返回结果
return new XmlResult(viewModel);
}
用fiddle进行模拟请求:
接受数据:

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

MVC学习系列——ModelBinder扩展的更多相关文章
- MVC学习系列——Filter扩展
在MVC中,Filter也是可以扩展的.在此,本人对Filter的理解就是AOP,不知道各位大侠,有什么高的见解,呵呵... 首先MVC四大过滤神器IAuthorizationFilter,IActi ...
- MVC学习系列——ActionResult扩展
首先,MVC扩展性非常强. 我从ActionResult扩展入手,因为我们知道微软ActionResult和其子类,有时候并不能满足所有返回值. 比如:我需要返回XML. 因此,现在我扩展XMLRes ...
- MVC学习系列——RazorViewEngine扩展
有时候,我们的项目涉及到多种风格,我们可以通过扩展RazorViewEngine,这样就可以保持后台代码不发生变化. 新建类ThemeViewEngine继承于RazorViewEngine publ ...
- MVC学习系列——HtmlHelper扩展
微软自带很多HtmlHelper: ActionLink - 链接到操作方法.BeginForm - 标记窗体的开头并链接到呈现该窗体的操作方法.CheckBox - 呈现复选框.DropDown ...
- MVC学习系列4--@helper辅助方法和用户自定义HTML方法
在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类, ...
- ASP.NET MVC学习系列(二)-WebAPI请求
继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...
- ASP.NET MVC学习系列(二)-WebAPI请求(转)
转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的g ...
- MVC学习系列——记一次失败面试后,感想。
在此写博客之际,热烈庆祝母校苏州科技学院,正式改名为苏州科技大学. 一晃眼,从自己投身IT行业已经两年有余,期间经历了结婚.买房等人生大事,非常感谢我的老婆,谢谢她这么爱我,嫁给我这个码农,呵呵... ...
- [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参
[转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...
随机推荐
- Kinect For Windows V2开发日志四:使用OpenCV显示深度图像
代码示例: #include <Kinect.h> #include <iostream> #include <opencv2\highgui.hpp> using ...
- fiddler 记录一些以前不熟悉的东西
fidddler已经用了3年了,一般就是抓包,看基本的信息,然后就是本地文件替换网络文件. 然后有一些很有用的东西的却没有深入的学习过. -_-!. 抓https的包 fiddler的过滤器的使用 ...
- 跟我一起学习ASP.NET 4.5 MVC4.0(五)(转)
前面几篇文章介绍了一下ASP.NET MVC中的一些基础,今天我们一起来学习一下在ASP.NET MVC中控件的封装.在页面中我们会经常使用到Html对象,来程序控件,当然这里的控件不是说ASP.NE ...
- android 使用NinePatch图作Background,导致布局混乱
在Layout中使用NinePatch图片作为其布局的背景图片时,可能会导致Layout中的布局发生混乱,此时将此Layout设置一个属性:android:padding="0dp" ...
- 正确理解SQL Server的许可证(转)
今天在论坛上看到有人讨论如果使用SQL Server作为SEPM的后台数据库,需要多少个CAL的问题: If I do have to use SQL Server what type of li ...
- Sublime Python 插件配置合集
Python PEP8 Autoformat 插件 这是用来按PEP8自动格式化代码的.可以在包管理器中安装.快捷键 CTRL+SHIFT+R 自动格式化python代码 { "auto_c ...
- Objective-C 【从文件中读写字符串(直接读写/通过NSURL读写)】
———————————————————————————————————————————从文件中读写字符串(直接读写/通过NSURL读写) #import <Foundation/Foundati ...
- C# 将日期转换成中文格式
没有什么难点,只是要小心,要考虑到月.日上 10 的说法,比如:10 不能直接转换成一〇,也不能像上 20 那样转换成一十〇,应该是十. 特点总结: 数字为 10 时,结果为十: 数字大于 10 时, ...
- 简单的json传送数据
<html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> ...
- 安装Apache(httpd服务)
安装Apache(httpd服务) ① 移动所有压缩包到root文件夹下(root的家) ② 解压httpd压缩包(.tar.gz) 使用tar指令解压.tar.gz压缩包 tar 指令 -zxf : ...