我创建了一个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")
,即使之前给了我一个错误。不知道为什么会有所作为。不知何故,有空白网址的网页绕过所有这些检查都会导致问题。
答案 0 :(得分:0)
你试过Server.Transfer()
吗?
您似乎可以对RouteValueDictionary进行更改,但它可以正常工作,但我不记得它是否是一个只读集合。
答案 1 :(得分:0)
通过稍微更改if语句来管理修复它。请参阅原始帖子中的编辑。仍然不完全确定出了什么问题。