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

2024-02-18

我目前有一个继承自的 BaseController 类System.Web.Mvc.Controller。在那堂课上我有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 http://example.com/user/999(其中 userID 999 不存在),他们将看到相应的 404 页面,但 URL 不会更改(他们不会重定向到错误页面)。

我无法实现这个想法

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

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

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

先谢谢您的帮助。

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

Edit:

我也尝试过以下方法但无济于事。

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”路线什么也没做。


找到了我的答案关于我的另一个问题 https://stackoverflow.com/questions/3432089/asp-net-mvc-use-reflection-to-find-if-a-controller-exists/3509955#3509955。非常感谢吴英杰 https://stackoverflow.com/users/43977/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));
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET MVC - 如何抛出类似于 StackOverflow 上的 404 页面 的相关文章

随机推荐

  • 在 XCode 5 中将项目导入远程 SVN 服务器

    以前在 XCode 4 中 在 Organizer 屏幕的 Repositories 部分中 有一个选项 导入 可将项目导入到 SVN 服务器中 该选项现在在 Xcode 5 的 Source Control 菜单中被禁用 尽管存储库已添加
  • Windows 7 无法写入物理驱动器?

    我编写了一个磁盘实用程序 允许您擦除整个物理驱动器 它使用 Windows 文件 api 调用 destFile CreateFile PhysicalDrive1 GENERIC WRITE FILE SHARE READ FILE SH
  • 如何使用 Postman 表单数据在 Django REST Framework 中发布嵌套数组?

    我有一个带有数组字段的嵌套可写序列化器 我需要用表单数据测试它 因为字段类型之一是ImageField 当我改变了ImageField into CharField如果我用原始 JSON 格式发布它 效果很好 我的简化版serializer
  • Linux下使用索引的文件搜索算法

    我想在linux中使用索引实现一个文件搜索程序 我知道还有其他几个文件搜索程序 例如beagled 但我这样做是为了学习目的 我对如何进行索引感到震惊 我从 maemo mapper 应用程序中得到了以下想法 例如 如果您有名为 sures
  • Symfony2 注销问题

    我正在 Symfony2 中测试安全环境 并且在注销过程中遇到问题 这是我的 security yml 文件 security firewalls secured area pattern anonymous switch user tru
  • 获取 IIS 应用程序文件系统路径

    我安装了 IIS 7 0 并且有一个带有 svc 服务的 net 应用程序 我想在应用程序指向的虚拟目录中指向一个文件 请注意 我在应用程序中转换了虚拟目录 但是 当我尝试使用 net verse 中的通用 api 调用打开文件 并且不指定
  • 比较 UIColors 或 CGColor 或 CGColorSpace

    我在比较 UIColors 时遇到问题 我有一张图像 我已成功提取用户单击的图像上的颜色 现在我想将该颜色与其他颜色进行比较 但我得到了一些奇怪的结果 这是我尝试过的 CGColorRef pixelColor buttonImage co
  • WordPress 插件 + Composer?

    我正在制作使用一些第三方库的 WordPress 插件 使用 Composer for WordPress 插件是常见做法吗 如果可以使用它 那么我认为我应该提供所有 Composer 文件以及我的插件 因为我不想让人们手动运行compos
  • 在多维数组中搜索某些值

    我有一个以下格式的多维数组 0 id gt 1 type gt fish owner gt bob 1 id gt 2 type gt cat owner gt mary 2 id gt 3 type gt dog owner gt lar
  • 通过 GitHub API 访问链接的 SAML 身份

    我想使用 GitHub API 任何版本 获取组织中 GitHub 登录名和电子邮件之间的映射 我可以使用以下 GraphQL 查询获取组织成员帐户上的电子邮件 query organization login myorg members
  • 如果 SSIS 中的值为 NULL,则条件拆分失败

    我根据以下规则将完整外连接的结果传递给条件拆分和过滤记录 基本上两个表具有相同的架构 并且主键值相同 a If Primary key of Source is NULL b If Primary Key of Destination is
  • MySQL:按块检索大选择

    我已经选择了更多 7000 万行 我想将选定的数据保存到一个大的csv文件于win2012 R2 问 如何从 MySQL 中按块检索数据以获得更好的性能 因为当我尝试保存一个我得到的大选择时 内存不足错误 您可以尝试使用LIMIT特征 如果
  • 存储和检索 SHA-256 散列和加盐密码的正确方法

    这是我第一次尝试安全地存储密码 我想确保一切都正确完成 建议我将 SHA 256 哈希与 salt 一起使用 假设用户通过表单提交了密码 我们通过以下方式获取密码 password POST password 对 password 加盐并对
  • ASP.NET MVC 和 IIS 5

    让 ASP NET MVC 应用程序托管在 IIS 5 6 或 7 上运行的最佳方法是什么 当我尝试发布 ASP NET MVC 应用程序时 我收到的似乎只是 404 错误 我做了一些谷歌搜索并找到了一些解决方案 但看起来都不是超级优雅 而
  • 如何从 Jena API Eclipse 项目启动 Fuseki 服务器?

    您好 我也是语义 Web 域和 Apache Jena 环境的新手 这就是我发布此问题的原因 我有一个使用 Jena API 的项目 当我运行它时 它会在控制台中显示输出 我确实从命令行运行了 Fuseki 服务器 它作为本地服务器运行 我
  • 运行 crontab 时出现权限被拒绝错误[重复]

    这个问题在这里已经有答案了 我在文件夹 csv file 中创建了一个 r 脚本 marc Marc Linux csv file ls 8388 26580527145 csv csv file Rproj excel source wr
  • Spark Dataframes UPSERT 到 Postgres 表

    我正在使用 Apache Spark DataFrames 来连接两个数据源并将结果作为另一个 DataFrame 获取 我想将结果写入另一个 Postgres 表 我看到这个选项 myDataFrame write jdbc url ta
  • Postman - 使用密钥文件进行 JWT 身份验证

    我正在尝试使用 Postman 来测试在 Google Cloud Platform 上开发的 API API 端点后面的 App Engine 我有 JSON 格式的密钥文件 type service account project id
  • BlackBerry 是否支持其应用程序开发人员的演示/测试版?

    我有兴趣为 BlackBerry 设备开发应用程序 想知道他们是否支持应用程序开发人员的演示版或测试版概念 我的意思是能够将我的应用程序的测试版或演示版部署给有限 受限的受众 例如业务合作伙伴 客户 外部测试人员等 他们中没有任何内容测试和
  • ASP.NET MVC - 如何抛出类似于 StackOverflow 上的 404 页面

    我目前有一个继承自的 BaseController 类System Web Mvc Controller 在那堂课上我有HandleError将用户重定向到 500 哎呀 我们搞砸了 页面的属性 目前这正在按预期进行 这有效