Fire my passion

Anything with my most passion……
ASP.NET MVC - Controller(part Ⅱ)

接着上次说的,这次继续说一下Controller的其他功能。

首先是IModelBinder接口。它只有一个方法:

public interface IModelBinder {
        
object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext);
    }

 这个方法可以将用户输入(Form,Route,Querystring)转换成我们自定义的类。ASP.NET MVC自身自带了一个Model Binder:DefaultModelBinder。它可以将输入值转换成.net 的原生类型,甚至是IList类型。但是如果我们需要将输入转换成自定义的类型的话,就需要进行扩展了。具体的用法,现在我还不是很清楚,还需要继续探索。但是可以知道的是,一旦自定义了一个Model Binder,就必须在Globle.asax中进行注册才行。

然后,就是说一下Controller的filter。filter的功能就是在ASP.NET MVC的请求过程中,插入自己的逻辑代码。其中,有4个接口是用于filter功能的:IActionFilter、IResultFilter、IAuthorizationFilter、IExceptionFilter。

public interface IActionFilter {
        
void OnActionExecuting(ActionExecutingContext filterContext);
        
void OnActionExecuted(ActionExecutedContext filterContext);
    }
public interface IAuthorizationFilter {
        
void OnAuthorization(AuthorizationContext filterContext);
    }
public interface IResultFilter {
        
void OnResultExecuting(ResultExecutingContext filterContext);
        
void OnResultExecuted(ResultExecutedContext filterContext);
    }
public interface IExceptionFilter {
        
void OnException(ExceptionContext filterContext);
    }

 可以看出,这些方法有一点像是WEBFORM中熟悉的那些页面生命周期事件。这些方法的执行顺序大概是:OnAuthorization -> OnActionExecuting -> OnActionExecuted -> OnResultExecuting -> OnResultExecuted -> OnException。当然最后那个OnException是不定的,因为一旦出现异常,程序就会立即执行这个方法。

Controller类,已经实现了这几个接口,所以我们就可以通过覆盖实现这几个方法来插入自定义逻辑。但是,还有一种更好的方法,就是使用FilterAttrbute,来插入自定义逻辑。这样做有一个很大的好处,那就是,我们可以针对某个Action进行逻辑操作,而不必操作整个Controller的所有Action。MVC默认给我们提供了几个Attribute。我们也可以编写我们自己的Attribute。写法大概就是,1.继承FilterAttribute 2.实现相应的接口 (上面所说的那4个)。

 关于Controller就说到这了,还有很多需要继续深入的地方。后面在慢慢补充吧。

posted on 2009-10-20 14:00  everx  阅读(271)  评论(0编辑  收藏  举报