【问题标题】:MVC error page is loaded in partial view在局部视图中加载 MVC 错误页面
【发布时间】:2012-10-26 14:13:02
【问题描述】:

我有一个错误页面,其布局在大多数情况下都可以正常工作,但是当返回部分视图的控制器中出现错误时,错误页面及其布局将放置在部分视图中。我想这是合乎逻辑的,但我希望将错误页面作为整页加载。如何在不更改所有错误处理的情况下实现这一点。

web.config:

<customErrors mode="On" defaultRedirect="~/Error">
  <error statusCode="500" redirect="~/SystemPages/ErrorPage" />
  <error statusCode="403" redirect="~/SystemPages/FileNotFound" />
  <error statusCode="404" redirect="~/SystemPages/FileNotFound" />
</customErrors>

全球.asax:

Shared Sub RegisterGlobalFilters(ByVal filters As GlobalFilterCollection)
    filters.Add(New HandleErrorAttribute())
End Sub

基础控制器:

Protected Overrides Sub OnException(ByVal filterContext As ExceptionContext)

    If filterContext Is Nothing Then Return

    If TypeOf (filterContext.Exception) Is FaultException Then
        Dim CodeName As String = 
        CType(filterContext.Exception, FaultException).Code.Name
        Dim Message As String = CType(filterContext.Exception, FaultException).Message
        TempData("ErrorMessage") = Message
    Else
        Logging.LogDebugData(HamtaDebugInformation(filterContext.RouteData))
        Logging.WriteExceptionLog(filterContext.Exception)
        TempData("ErrorMessage") = filterContext.Exception.Message
    End If

    Response.Redirect("/SystemPages/ErrorPage")

End Sub

搜索控制器:

   Function GetData() As ActionResult
   ...
   Return PartialView("_Tab", vmData)

错误页面:

@Code
ViewData("Title") = "ErrorPage"
Layout = "~/Views/Shared/_Layout.vbhtml"
End Code

<div id="mainContent" class="oneColumn">
<div class="panel">
    <span class="panelTLC"></span>
    <span class="panelTRC"></span>
    <div id="inputPanel" class="panelContent">
        <div class="modul">
            <div class="modulHead">
                <span class="TLC"></span>
                <span class="TRC"></span>
            </div>
            <div class="modulContent">
                <span class="TLC"></span><span class="TRC"></span>
                <p>@ViewBag.ErrorMessage</p>
                <p>@TempData("ErrorMessage")</p>
                <span class="BLC"></span>
                <span class="BRC"></span>
            </div>
        </div>
    </div>
    <span class="panelBLC"></span><span class="panelBRC"></span>
</div>
</div>

【问题讨论】:

    标签: asp.net-mvc error-handling partial-views


    【解决方案1】:

    您可以只使用 try catch 块并在 catch 中返回 View() 而不是 PartialView()。

    Function GetData() As ActionResult
    Try
    ...
    Return PartialView("_Tab", vmData)
    Catch ex as Exception
    //Handle exception here ( send to error log, etc)
    Return View("~/SystemPages/ErrorPage")
    End Try
    

    web.config:

    <customErrors mode="On"/>
    

    基础控制器:

    Protected Overrides Sub OnException(ByVal filterContext As ExceptionContext)
    
        If filterContext Is Nothing Then Return
    
        Dim Message As String
    
        If TypeOf (filterContext.Exception) Is FaultException Then
            Dim CodeName As String = 
            CType(filterContext.Exception, FaultException).Code.Name
            Message = CType(filterContext.Exception, FaultException).Message
        Else
            Logging.LogDebugData(HamtaDebugInformation(filterContext.RouteData))
            Logging.WriteExceptionLog(filterContext.Exception)
            Message = filterContext.Exception.Message
        End If
    
        Response.Redirect(String.Format("~/Error/HttpError/?message={1}", "HttpError", Message))
    
    End Sub
    

    错误控制器:

    public class ErrorController : Controller
    {
        // GET: /Error/HttpError
        public ActionResult HttpError(string message) {
           return View("ErrorTest", message);
    }
    

    此帖:ASP.NET MVC Custom Error Handling Application_Error Global.asax?

    介绍如何分别处理每种类型的错误。请记住,您是在 basecontroller 而不是 global.asax 文件中处理异常。如果您能够更改异常处理,那将是更好的方法。

    【讨论】:

    • 谢谢@rbj325!我喜欢第一种方法,但 ErrorPage 不是一个视图,所以它不起作用。如果我像这样返回一个错误视图,Return View("ErrorTest"),它仍然会加载到局部视图中并弄乱布局。我对 MVC 很陌生,所以我不太了解第二种方法。
    • 再次感谢!但是错误页面仍然加载在局部视图中。我发现可行的唯一方法是在 catch 块中重定向这个 javascript,但我认为这是解决问题的一种丑陋的方法。返回 JavaScript(String.Format("document.location = '{0}'", "/SystemPages/ErrorPage"))
    • 你能发布你的错误页面代码吗?您可以将任何页面变成视图。您可能只需要覆盖布局页面。
    • 这并不能解决您的自定义错误页面在部分显示中的问题。
    猜你喜欢
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 2012-01-04
    相关资源
    最近更新 更多