【问题标题】:ASP.NET MVC - Show 404 Shared View WITHOUT a ControllerASP.NET MVC - 在没有控制器的情况下显示 404 共享视图
【发布时间】:2011-05-11 03:22:38
【问题描述】:

我正在查看this so question,其中回答者展示了一种从 Global.asax 中的 Application_Error 方法抛出 NotFoundException 的好方法。

这很棒,但是我想稍微修改一下……只是不确定如何。

我的共享视图文件夹中有一个 NotFound 视图和一个错误视图。我想继续这个,不必有 ErrorController。

当“控制器”不存在时,有什么方法可以抛出 404 NotFound 错误,而仍然不必有错误控制器?

IE:如果您访问http://example.com/asdf,而 asdf 是一个无效的控制器,我希望从我的共享视图目录中加载“未找到”视图。

编辑

基本上我遇到的问题是“DRY”。我可以构建一个 ErrorController,但是如果我这样做,那么我必须在两个位置拥有 same view。我的 Views/Error 文件夹中的一个仅用于这种情况,一个位于我的 Views/Shared 文件夹中,我可以从任何控制器加载错误或 NotFound 视图。

我也试过了

Private Sub BaseGlobal_Error(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Error
    Dim exception As System.Exception = Server.GetLastError
    Response.Clear()

    Dim httpException As HttpException = TryCast(exception, HttpException)

    Dim routeData As RouteData = New RouteData()
    routeData.Values.Add("controller", "Events")

    If (Not httpException Is Nothing) And (httpException.GetHttpCode = 404) Then
        routeData.Values.Add("action", "NotFound")
        Server.ClearError()
        Dim errorController As IController = New UrbanNow.Core.Controllers.EventsController
        Response.StatusCode = 404
        errorController.Execute(New RequestContext(New HttpContextWrapper(Context), routeData))
    End If
End Sub

EventsController 显然是用于事件的,但尝试在 NotFound 视图中加载(希望它会从共享目录中拉出……但我没有运气。

【问题讨论】:

  • 嗯,现在我想起来了……这可能是不可能的。期待听到您的意见。

标签: asp.net-mvc error-handling http-status-code-404


【解决方案1】:

this so question 的答案可能是您正在寻找的,但您可能无法将页面放入共享文件夹(为此您可能需要一个控制器)。

【讨论】:

  • 该页面上“最受好评”的答案表明您在 web.config 中执行此操作。问题在于它要么需要控制器,要么需要静态页面。我想避免这两种情况。我正在尝试只使用我的共享控制器来完成它。
【解决方案2】:

我发现了一些针对我的问题的 hack/workaround 解决方案,尽管它实际上并没有消除对控制器或视图的需求

Private Sub Application_Error(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Error
    Dim exception As System.Exception = Server.GetLastError()
    Dim httpException As HttpException = DirectCast(exception, HttpException)

    Dim routeData As New RouteData()
    routeData.Values.Add("controller", "Error")

    If exception IsNot Nothing Then
        If httpException.GetHttpCode = 404 Then
            routeData.Values.Add("action", "Index")
            Server.ClearError()
            Dim errorController As IController = New MyApp.Core.Controllers.ErrorController
            Response.StatusCode = 404
            errorController.Execute(New RequestContext(New HttpContextWrapper(Context), routeData))
        End If
    End If
End Sub

基本上在这里我将用户重定向到错误/索引页面,但是当他们到达那里时,这就是控制器所做的

Public Class ErrorController : Inherits MyApp.Core.Base.BaseController
    Function Index() As ActionResult
        Throw New ResourceNotFoundException
    End Function
End Class

这可行,会引发适当的错误并将它们带到适当的页面......但它并没有消除对控制器或视图的需求......尽管索引视图完全是空白的。

【讨论】:

  • 我非常希望听到更好的方法。
【解决方案3】:

创建一个 VirtualPathProvider。 ASP.Net 使用它来查找文件(视图)。

示例代码:http://padcom13.blogspot.com/2009/04/virtualpathprovider-example.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-21
    • 2011-12-19
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多