C# 处理MVC视图与PartialView时出错

C# 处理MVC视图与PartialView时出错,c#,asp.net-mvc,asp.net-mvc-4,error-handling,exception-handling,C#,Asp.net Mvc,Asp.net Mvc 4,Error Handling,Exception Handling,我读过很多关于MVC中错误处理的书,特别是关于应用HandleError属性和在Global.asax上使用Application_error的书。我对优雅地处理以下类型的异常感兴趣: 控制器内部引发的异常 在视图中执行数据绑定时引发异常。 目前,我的应用程序的行为方式如下 控制器中引发的所有异常均未处理。它们达到了Global.asax的应用程序错误方法 视图中的所有异常都未经处理,并到达Global.asax的Application\u Error方法 在Application_Error方

我读过很多关于MVC中错误处理的书,特别是关于应用HandleError属性和在Global.asax上使用Application_error的书。我对优雅地处理以下类型的异常感兴趣:

控制器内部引发的异常 在视图中执行数据绑定时引发异常。 目前,我的应用程序的行为方式如下

控制器中引发的所有异常均未处理。它们达到了Global.asax的应用程序错误方法 视图中的所有异常都未经处理,并到达Global.asax的Application\u Error方法 在Application_Error方法中,我记录异常,决定应用程序是本地运行还是远程运行。如果是这样,我将向用户显示黄色屏幕,或者执行响应。重定向到自定义错误页面。 对于在呈现父视图或父视图本身的控制器内引发的错误,此逻辑可以正常工作。这种逻辑的缺点是,当一个错误被抛出到一个应该呈现PartialView的子操作中时,整个页面将变得不可用。这是因为黄色错误屏幕或自定义错误页面占据了整个页面,不允许用户查看页面的其他部分

我想做/知道的是,是否有可能:

在局部视图内显示黄色错误屏幕,但正确呈现页面的其余部分。 将用户重定向到允许页面其余部分保持可用的部分视图错误页面。
要处理此特定情况,请执行以下操作:

在子操作中引发错误时,应呈现 PartialView整个页面将无法使用

您可以为ajaxError定义一个全局Ajax事件处理程序,以处理使用@Html.Partial调用的操作引发的异常

除了处理应用程序中的所有错误外,我们还在_Layout.cshtml中定义了以下全局处理程序。这基本上可以处理从html调用部分视图并且操作引发异常的情况。如果遇到错误,将记录数据并显示toastr弹出消息

_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();
    });

我得到了类似的设置,从来没有任何问题。我们使用局部视图。非常想知道您是否可以提供一个示例代码,我可以在这里用我的设置测试,当在子操作中抛出错误时,该错误会导致部分视图整个页面变得不可用。我想您可以在您的设置中看到答案,global.asax是应用程序的全局,如果要处理应用程序内部的错误,则需要更改应用程序设置,并设置一个使用母版页的错误页,并根据您希望客户端访问的内容将其插入某个位置。您可以有一个呈现消息等的局部视图…@SBirthare只需在控制器操作或局部视图中的任意位置添加抛出新异常代码行,然后查看发生了什么@杰克,我准备好了。全局错误页已定义,用户将被重定向到该页。所以,整个页面被我的自定义屏幕所取代,我明天会尝试,但很确定这不是我们错过的不寻常的情况。我希望我现有的配置能够优雅地处理它。@LuisBecerril-我检查了我的应用程序,我们可以优雅地处理这种情况。我在回答中补充了一些信息。希望这会有所帮助。