我从ActionFilterAttribute派生自定义属性,以处理在用户超时后异步加载的部分视图。这是我对OverActionExecuting的重写:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (IsTimeoutAndAjax(filterContext))
{
/* First we ensure that the timeout view exists, and if not, we
* throw an exception. Handling of the exception is upon the
* consumer.*/
ViewEngineResult testView = ViewEngines.Engines.FindView(
filterContext,
TIMEOUT_VIEW_NAME,
null);
if (testView.View == null)
{
throw new Exception(
"PartialTimeoutAttribute failure: the partial timeout view "
+ TIMEOUT_VIEW_NAME
+ " does not exist!");
}
/* Since this is a partial view result (or should be!) we're going
* to return a partial view of our choosing rather than the expected
* result. The view contains an alert to let the user know their
* session has expired then redirects the entire page to the login
* form. A sample view of this type would look like this:
@{
Layout = null;
}
<script type="text/javascript">
alert('Your session has timed out. You will now be redirected to the login page.');
window.location = '/Account/LogOn';
</script>
*/
PartialViewResult result = new PartialViewResult();
result.ViewName = TIMEOUT_VIEW_NAME;
filterContext.Result = result;
}
base.OnActionExecuting(filterContext);
}
有没有人为这种属性编写单元测试?我最好/唯一的赌注是模拟ActionExecutingContext吗?可选地,如果有一种更优雅的方式来处理整个场景(用户坐在页面上太长而且超时,点击一个按钮,将部分视图加载到目标div)我很乐意听到它。 / p>