ASP.NET MVC2 - 在重写控制器中重定向到Url

时间:2010-07-21 20:51:50

标签: asp.net-mvc-2 redirect controller response.redirect

我创建了一个ControllerBase类,它覆盖了默认Controller类的Execute方法。我这样做是为了检查网址并从我们的数据库中提取相关页面。如果找不到该页面,我想重定向到特定的URL(“invalid-page”)。一切正常,除了重定向。我试过使用Response.Redirect(“invalid-page”),但它给了我一个空的引用错误。还尝试了requestContext.HttpContext.Response.Redirect(“invalid-page”),但同样的错误。我猜它不想让你通过使用响应重定向绕过MVC进程。由于覆盖实际上没有返回ActionResult,我不能只返回Redirect操作。有人知道如何在这里进行重定向吗?

这是我的ControllerBase类:

public class ControllerBase : Controller
{
    protected override void Execute(System.Web.Routing.RequestContext requestContext)
    {
        ViewData.Model = new DynamicPage{ LeftColumnCss = "bg5"};
        var friendlyUrl = (string)requestContext.RouteData.Values["friendlyUrl"];
        if (friendlyUrl != null && !friendlyUrl.Equals("invalid-page"))
        {
            var page = PageService.FetchByFriendlyUrl(null, (int?)PageCategoryType.MomMavens, friendlyUrl);

            if (page == null)
            {
                var archivedPage = PageArchiveService.FetchByFriendlyUrl(friendlyUrl);
                if (archivedPage != null)
                {
                    page = PageService.FetchById(archivedPage.PageID);
                    if (page != null)
                    {
                        requestContext.HttpContext.Response.Redirect(PageService.GetPageAbsoluteUrl(page));
                    }
                }
            }

            if (page == null)
            {
                //This is where I need to figure out how to do a redirect                   //requestContext.HttpContext.Response.Redirect("invalid-page");
                //base.Redirect("invalid-page");
                Response.Redirect("contact-us");
                return;
            }
            ((DynamicPage)ViewData.Model).CurrentPage = page;

            // Allow the page to override the left column class
            if (!string.IsNullOrEmpty(page.LeftColumnCssClasses))
            {
                var classes = page.LeftColumnCssClasses.Split(';');
                var index = SubSonic.Sugar.Numbers.Random(0, classes.Length);
                if (index == classes.Length)
                    index--;
                ((DynamicPage)ViewData.Model).LeftColumnCss = classes[index];
            }
        }

        base.Execute(requestContext);
    }

}

编辑: 不知何故,我设法通过更改行来修复它:

if (friendlyUrl != null && !friendlyUrl.Equals("invalid-page"))

为...

if (!friendlyUrl.Equals("invalid-page"))

然后使用requestContext.HttpContext.Response.Redirect("invalid-page"),即使之前给了我一个错误。不知道为什么会有所作为。不知何故,有空白网址的网页绕过所有这些检查都会导致问题。

2 个答案:

答案 0 :(得分:0)

你试过Server.Transfer()吗?

您似乎可以对RouteValueDictionary进行更改,但它可以正常工作,但我不记得它是否是一个只读集合。

答案 1 :(得分:0)

通过稍微更改if语句来管理修复它。请参阅原始帖子中的编辑。仍然不完全确定出了什么问题。