Я создал класс 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-адресами в обход всех этих проверок вызвало проблему.