0

我已经阅读了很多关于MVC中的错误处理(特别是关于应用HandleError属性和关于在Global.asax上使用Application_Error的问题)。我很感兴趣,适当地处理以下类型的异常:处理MVC视图和部分视图的错误

  • 异常控制器内部抛出
  • 例外执行视图中的数据绑定时抛出。

目前我的应用程序的行为以下列方式

  1. 控制器抛出所有的异常都是未处理。他们到达Global.asax的Application_Error方法
  2. 视图中的所有异常都未处理并且达到Global.asax的Application_Error方法一旦进入Application_Error方法,我将记录该异常,决定是否运行该应用程序本地或远程。如果是这样,我向用户呈现黄色屏幕,或执行Response.Redirect到自定义错误页面。

这个逻辑对于渲染父视图或父视图本身的控制器中抛出的错误是正确工作的。这种逻辑的缺点是,如果在应该呈现PartialView的Child Action内引发错误,整个页面将变得不可用。这是因为黄色错误屏幕或自定义错误页面占用了整个页面,并且不允许用户查看网页的其他部分。

我想要做的/知道的是,如果它是可能的:

  1. 显示的局部视图内的黄色错误屏幕,但正确渲染页面的其余部分。
  2. 将用户重定向到部分视图错误页面,以允许页面的其余部分保持可用状态。
+0

我有类似的设置,从未发生过任何问题。我们全部使用局部视图。所以很想知道你是否可以提供一个示例代码,我可以使用我的设置来测试这个代码:“当一个错误被引入到一个应该呈现PartialView的子Action中时,整个页面变得不可用。”? – SBirthare 2015-03-31 04:46:50

+0

我想你可以在你的设置中看到答案,全球。ASAX是全球性的应用程序,如果你要处理,你需要改变你的应用程序设置的应用程序内部的错误,并且设置了使用您的母版,并根据你想在客户端什么插在一个位置上的错误页面有权访问。您可以呈现一个消息等的局部视图....发生 – 2015-03-31 07:45:19

+0

@SBirthare只需添加代码'抛出新的异常()'行内的控制器操作或局部视图内的任何地方,看看有什么。 @JackM我已经准备好了。全局错误页面已经定义并且用户被重定向到它。所以,整个页面被我的自定义屏幕代替 – 2015-03-31 15:43:10

回答

0

为了处理这种特殊情况:

“当错误被抛出一个子操作,其应该呈现 PartialView整个页面变得不可用里面的”

您可以为“ajaxError”定义全局Ajax事件处理程序,以处理从使用“@ Html.Partial”调用的操作抛出的异常。

除了处理“Application_Error”中的所有错误,我们在_Layout.cshtml中定义了以下全局处理函数。这基本上处理了从html调用部分视图的情况,并且该操作引发了异常。如果遇到错误,则会记录数据并显示托运弹出消息。

_Layout.cshtml:

//Ajax Global Event Loader 
    globalVar: ajaxContainer = $('div[id=wrap]'); 
    $(document).bind("ajaxSend", function() { 
     if ($('.k-loading-mask').is("visible") == false) { 
      var loader = new ajaxLoader(ajaxContainer, { bgColor: '#fff', duration: 800, opacity: 0.3, classOveride: false }); 
     } 
    }).bind("ajaxComplete", function() { 
     if ($('div[class=ajax_overlay]').is(':visible') == true) 
      $('div[class=ajax_overlay]').remove(); 
    }).bind("ajaxError", function (event, jqxhr, settings, thrownError) { 
     //debugger; 
     $('div[class=ajax_overlay]').remove(); 
     $('.k-loading-image').remove(); 
     if ((settings.url.indexOf('Notification/GetActiveNotificationByUserName') < 0) 
      && (settings.url.indexOf('LogError/LogData') < 0)) { 
      var errorData = 'URL: ' + settings.url + '; Type: ' + settings.type + '; Data: ' + settings.data + '; thrownError: ' + thrownError; 
      var model = { errorData: errorData }; 

      $.ajax({ 
       url: '@Url.Action("LogData", "LogError")', 
       contentType: 'application/json; charset=utf-8', 
       type: 'POST', 
       dataType: 'html', 
       data: JSON.stringify(model) 
      }) 
      .success(function (result) { 
       $("div.overlay").hide(); 
      }) 
      .error(function (xhr, status) { 
       $("div.overlay").hide(); 
       //alert(status); 
      }); 

      // Set toastr for error notification and display error 1 at a time 
      toastr.options.closeButton = true; 
      toastr.options.positionClass = 'toast-top-full-width'; 
      toastr.options.showMethod = 'slideDown'; 
      toastr.options.hideMethod = 'slideUp'; 
      toastr.options.showDuration = '1000'; 
      toastr.options.hideDuration = '1'; 
      toastr.clear(); 
      toastr.error('Your request cannot be processed right now. Please try again later!'); 
     } 

     $("div.overlay").hide(); 
    });