MVC學習系列——ModelBinder擴展

     在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返回數據:

相關文章
相關標籤/搜索