gpt4 book ai didi

ASP.NET MVC - 如何抛出一个类似于 StackOverflow 上的 404 页面

转载 作者:行者123 更新时间:2023-12-04 00:57:37 24 4
gpt4 key购买 nike

我目前有一个继承自 System.Web.Mvc.Controller 的 BaseController 类。 .在那堂课上,我有 HandleError将用户重定向到“500 - 糟糕,我们搞砸了”页面的属性。这目前正在按预期工作。

此作品

<HandleError()> _
Public Class BaseController : Inherits System.Web.Mvc.Controller

''# do stuff
End Class

我也有我的 404 页在 Per-ActionResult 的基础上工作,它再次按预期工作。

此作品
    Function Details(ByVal id As Integer) As ActionResult
Dim user As Domain.User = UserService.GetUserByID(id)

If Not user Is Nothing Then
Dim userviewmodel As Domain.UserViewModel = New Domain.UserViewModel(user)
Return View(userviewmodel)
Else
''# Because of RESTful URL's, some people will want to "hunt around"
''# for other users by entering numbers into the address. We need to
''# gracefully redirect them to a not found page if the user doesn't
''# exist.
Response.StatusCode = CInt(HttpStatusCode.NotFound)
Return View("NotFound")
End If

End Function

同样,这很好用。如果用户输入类似 http://example.com/user/999 的内容(其中用户 ID 999 不存在),他们将看到相应的 404 页面,但 URL 不会更改(他们不会重定向到错误页面)。

我无法让这个想法发挥作用

这就是我遇到问题的地方。如果用户输入 http://example.com/asdf-他们被踢到通用 404 页面。我想要做的是保持 URL 原封不动(即:不重定向到任何其他页面),而只是显示“NotFound” View 以及推送 HttpStatusCode.NotFound给客户。

例如,只需访问 https://stackoverflow.com/asdf您将在其中看到自定义 404 页面并看到完整的 URL。

显然我错过了一些东西,但我无法弄清楚。由于“asdf”实际上并不指向任何 Controller ,因此我的基本 Controller 类没有启动,因此我无法在其中的“HandleError”过滤器中执行此操作。

预先感谢您的帮助。

注意:我绝对不想将用户重定向到 404 页面。我希望他们留在现有的 URL 上,我希望 MVC 将 404 VIEW 推送给用户。

编辑:

我也尝试了以下方法无济于事。
Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
routes.RouteExistingFiles = False
routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
routes.IgnoreRoute("Assets/{*pathInfo}")
routes.IgnoreRoute("{*robotstxt}", New With {.robotstxt = "(.*/)?robots.txt(/.*)?"})

routes.AddCombresRoute("Combres")

''# MapRoute allows for a dynamic UserDetails ID
routes.MapRouteLowercase("UserProfile", _
"Users/{id}/{slug}", _
New With {.controller = "Users", .action = "Details", .slug = UrlParameter.Optional}, _
New With {.id = "\d+"} _
)


''# Default Catch All Valid Routes
routes.MapRouteLowercase( _
"Default", _
"{controller}/{action}/{id}/{slug}", _
New With {.controller = "Events", .action = "Index", .id = UrlParameter.Optional, .slug = UrlParameter.Optional} _
)

''# Catch All InValid (NotFound) Routes
routes.MapRoute( _
"NotFound", _
"{*url}", _
New With {.controller = "Error", .action = "NotFound"})

End Sub

我的“NotFound”路线什么都不做。

最佳答案

找到我的答案 on my other SO question .非常感谢Anh-Kiet Ngo为解决方案。

protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();

// A good location for any error logging, otherwise, do it inside of the error controller.

Response.Clear();
HttpException httpException = exception as HttpException;
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "YourErrorController");

if (httpException != null)
{
if (httpException.GetHttpCode() == 404)
{
routeData.Values.Add("action", "YourErrorAction");

// We can pass the exception to the Action as well, something like
// routeData.Values.Add("error", exception);

// Clear the error, otherwise, we will always get the default error page.
Server.ClearError();

// Call the controller with the route
IController errorController = new ApplicationName.Controllers.YourErrorController();
errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
}
}

关于ASP.NET MVC - 如何抛出一个类似于 StackOverflow 上的 404 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3431211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com