这一篇文章可能会比较凌乱。因为我分析ModelBinder的过程并不顺利,牵涉到的类总是互相缠绕,几乎在源码中迷路。我最终决定用画图来理清这些萦绕不断的关系。
Model Bind的原理
Model BInd其实就是把从把Request中的QueryString, InputStream, Form和RouteData通过各种形式绑定到一个object的过程。
Providers的数据源:
RouteDataValueProvider: controllerContext.RouteData.Values
ChildActionValueProvider: controllerContext.RouteData.Values
HttpFileCollectionValueProvider: controllerContext.HttpContext.Request.Files
FormValueProvider: controllerContext.HttpContext.Request.Form
QueryStringValueProvider: controllerContext.HttpContext.Request.QueryString
注:每个Provider都会针对某一个数据源做特定的分析,其中FormValueProvider用的比较广泛,向后台发送json数据,若没有将contentType申明为以"application/json",并将json转换成字符串的话,后台是无法处理这些json数据的,原因在这篇文章中就不展开讲了。