在MVC系统中,咱们接受数据,运用的是ModelBinder 的技术。html
MVC学习系列——ActionResult扩展在这个系列中,咱们自定义了XmlResult的返回结果。数据结构
那么是否是意味着能POST一个XML数据类型给咱们项目,这样的话,咱们须要自定义一个XmlModelBinder来接受XML数据。ide
新建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中,运用:spa
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的请求3d
接受数据:code
由于viewModel.Name = "Result";
因此,在Fiddler中查看返回数据:xml
就这样,简单实现了:可以接收XML数据结构的功能htm
可是,这样作带来一个问题,就是每次须要XML的时候,就得加上[ModelBinder(typeof(XmlModelBinder))]这段代码,非常麻烦。blog
那么问题来了: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返回数据: