在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扩展的更多相关文章

  1. MVC学习系列——Filter扩展

    在MVC中,Filter也是可以扩展的.在此,本人对Filter的理解就是AOP,不知道各位大侠,有什么高的见解,呵呵... 首先MVC四大过滤神器IAuthorizationFilter,IActi ...

  2. MVC学习系列——ActionResult扩展

    首先,MVC扩展性非常强. 我从ActionResult扩展入手,因为我们知道微软ActionResult和其子类,有时候并不能满足所有返回值. 比如:我需要返回XML. 因此,现在我扩展XMLRes ...

  3. MVC学习系列——RazorViewEngine扩展

    有时候,我们的项目涉及到多种风格,我们可以通过扩展RazorViewEngine,这样就可以保持后台代码不发生变化. 新建类ThemeViewEngine继承于RazorViewEngine publ ...

  4. MVC学习系列——HtmlHelper扩展

    微软自带很多HtmlHelper: ActionLink - 链接到操作方法.BeginForm  - 标记窗体的开头并链接到呈现该窗体的操作方法.CheckBox  - 呈现复选框.DropDown ...

  5. MVC学习系列4--@helper辅助方法和用户自定义HTML方法

    在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类, ...

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

    继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...

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

    转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的g ...

  8. MVC学习系列——记一次失败面试后,感想。

    在此写博客之际,热烈庆祝母校苏州科技学院,正式改名为苏州科技大学. 一晃眼,从自己投身IT行业已经两年有余,期间经历了结婚.买房等人生大事,非常感谢我的老婆,谢谢她这么爱我,嫁给我这个码农,呵呵... ...

  9. [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参

    [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...

随机推荐

  1. javascript跨域请求RESTful Web Service

    跨域请求RESTful Web Service 当我们用js请求RESTful Web Service的时候,通常会出现跨域无法访问的问题,也就是无法正常得到我们要的值.jsonp是个解决问题的方法. ...

  2. 【原】 twemproxy ketama一致性hash分析

    转贴请注明原帖位置:http://www.cnblogs.com/basecn/p/4288456.html 测试Twemproxy集群,双主双活 向twemproxy集群做写操作时,发现key的分布 ...

  3. 四舍五入PK银行四舍五入

    描述 在实际开发中decimal.Round(1.23525,4)!=1.2353实际是1.2352,而decimal.Round(1.23535,4)==1.2354 说明 四舍五入:当舍去位的数值 ...

  4. AngularJS尝鲜一

    第一个小例子,体验一下: <!DOCTYPE html> <html> <head> <title>Index</title> </h ...

  5. JavaScript之动画2

    在JavaScript动画中,我们调用setInterval函数(setInterval动作的作用是在播放动画的时,每隔一定时间就调用函数,方法或对象),值得注意的是:setInterval它设置的时 ...

  6. byte[] 清空

    1. using(byte buff = new byte[Size]){  // 你要用的代码,} 2. Array.Clear(bytes, 0 ,bytes.Length);

  7. ArcSDE for Microsoft SQL Server Post Installation图解(转)

    ArcSDE for Microsoft SQL Server Post Installation图解 使用ArcSDE作为空间数据引擎时,经常遇到服务无法启动的情况(启动服务时提示:本地计算机上的a ...

  8. C++ 11 之Lambda

    1.Lambda表达式来源于函数式编程,说白就了就是在使用的地方定义函数,有的语言叫“闭包”,如果 lambda 函数没有传回值(例如 void ),其回返类型可被完全忽略. 定义在与 lambda ...

  9. 从malloc中窥探Linux内存分配策略

        malloc函数是C/C++中常用内存分配库函数,本篇文章将以Linux平台上的malloc为剖析对象,深入了解分配一块内存的旅程. malloc入门      使用malloc,需要包含头文 ...

  10. 字符串反转(StringBuffer)

    package com.java1234.chap03.sec08; public class zifufanzhuan { public static void main(String[] args ...