在asp.net mvc2中Ajax Froms的错误重定向

时间:2010-08-31 15:14:25

标签: asp.net ajax asp.net-mvc-2 asynchronous error-handling

我正在构建一个asp.net mvc2网站并使用大量的ajax表单元素(准确地说是Ajax.BeginForm)来异步填充页面上的数据。我想在网站上x不活动的时间后将用户重定向到登录页面。当我这样做时,无论是通过ActionExecutingContext还是HttpContext,登录页面都填充在该ajax表单的当前div元素中,而不是整个页面。有关如何让它重定向当前页面的任何想法吗?

2 个答案:

答案 0 :(得分:2)

解决方案:

覆盖基本控制器中的OnActionExecuted事件,并创建一个RedirectResult以在需要重定向的任何地方调用。添加以下代码:

protected RedirectResult Redirect(string url, ActionExecutedContext filterContext)
{
    return new AjaxErrorRedirectResult(url, filterContext);
}

public class AjaxErrorRedirectResult : RedirectResult
    {
        public AjaxErrorRedirectResult(string url, ActionExecutedContext filterContext)
            : base(url)
        {
            ExecuteResult(filterContext.Controller.ControllerContext);
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context.RequestContext.HttpContext.Request.IsAjaxRequest())
            {
                string redirectUrl = "www.google.com";

                JavaScriptResult result = new JavaScriptResult()
                {
                    Script = "self.parent.location='" + redirectUrl + "';"
                };
                result.ExecuteResult(context);
            }
            else
            {
                base.ExecuteResult(context);
            }
        }
    }

答案 1 :(得分:0)

如果要在提交表单时将用户重定向到另一个页面(登录页面),那么为什么要使用ajax? AJAX最适合用于操作页面的一部分而不是整个页面。

Ajax.BeginForm有一个选项对象,用于指定要更新的HTML元素的ID和更新的类型

例如

Ajax.BeginForm("Create", "Project", 
                new AjaxOptions() { 
                                   UpdateTargetId = "projectform", 
                                   InsertionMode = InsertionMode.Replace, 
                                   HttpMethod = "Post" })

InsertionMode选项有三个值ReplaceInsertAfterInsertBefore

在您的情况下,我不知道您是否可以在UpdateTargetId中定位HTML标记。但正如我之前所说,在这种情况下使用正常请求更好,而不是使用Ajax更新整个页面。

关于在一段时间不活动后将用户重定向到登录页面。我相信塞申斯是做到这一点的正确方法。我不确定它是如何完成的。

更新:

我希望此链接有助于: http://blog.tallan.com/2010/06/25/handle-asp-net-mvc-session-expiration/