在MVC系統中,我們接受數據,運用的是ModelBinder 的技術。 MVC學習系列——ActionResult擴展在這個系列中,我們自定義了XmlResult的返回結果。 那麼是不是意味著能POST一個XML數據類型給我們項目,這樣的話,我們需要自定義一個XmlModelBinder來接受XML ...
在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返回數據: