ASP.NET MVC2 - перенаправление на URL в переопределенном контроллере - PullRequest
2 голосов
/ 22 июля 2010

Я создал класс ControllerBase, который переопределяет метод Execute класса Controller по умолчанию. Я делаю это, чтобы проверить URL и извлечь соответствующую страницу из нашей базы данных. Если страница не найдена, я хочу перенаправить на определенный 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);
    }

}

EDIT: Каким-то образом мне удалось это исправить, изменив строку:

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

до ...

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

, а затем с помощью requestContext.HttpContext.Response.Redirect("invalid-page"), хотя раньше это приводило к ошибке. Не уверен, почему это имело значение. Каким-то образом наличие страниц с пустыми URL-адресами в обход всех этих проверок вызвало проблему.

Ответы [ 2 ]

0 голосов
/ 22 июля 2010

Удалось исправить это, слегка изменив оператор if. См редактировать в оригинальном сообщении. Все еще не совсем уверен, что случилось.

0 голосов
/ 22 июля 2010

Вы пробовали Server.Transfer()?

Похоже, вы могли бы внести изменения в RouteValueDictionary, и это сработало бы, но я не могу вспомнить, является ли это коллекция только для чтения.

...