上篇文章"Asp.net MVC使用Filter解除Session, Cookie等依賴"介紹了如何使用Filter來解除對於Session, Cookie的依賴。
其實這個也可以通過Model Binding來達到同樣的效果。
什么是Model Binding?
Model Binding的作用就是將Request請求中包含的散亂參數,根據接受請求的Action方法的參數列表,自動智能地構建這些參數的過程。
問題分析
常見的對於Session依賴的代碼:
public ActionResult Index() { var user = Session[“UserAccuont”];//從Session中獲取當前登錄用戶的信息 //send email var email = user.Email; ………… }
我們期望將函數改造成:
public ActionResult Index(UserAccount sessionUser) { //send email var email = sessionUser.Email; ………… }
讓Index action方法不用在方法內訪問Session, 從而解除對於Session的依賴。
如果MVC能夠智能的構造參數sessionUser, 從session取的數據,就能夠解決我們的問題了。這就需要我們的Model Binding出場了。
自定義Model Binding
繼承接口IModelBinder, 實現BindModel方法。
這個UserAccountModelBinder的作用就是從Session中取得UserAccount.
public class UserAccountModelBinder : IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { if(controllerContext.HttpContext.Session["UserAccuont"] != null) { return controllerContext.HttpContext.Session["UserAccuont"]; } return null; } }
接下來,我們要為這個ModelBinder,添加到MVC的Model Binding設置中,使得它能夠在MVC的生命周期中起作用。
在Global.asax.cs文件的Application_Start()方法中,添加UserAccountModelBinder
protected void Application_Start() { ……… //凡是UserAccount類型的參數,都會使用UserAccountModelBinder來處理,也就是會從Session中取值 ModelBinders.Binders.Add(typeof(UserAccount), new UserAccountModelBinder ()); }
上面就是全部的Model Binding解決問題的過程,希望能夠幫助大家更好地理解MVC中的Model Binding.