MVC:当在控制器方法中抛出异常时,错误页面在主布局内部打开

时间:2018-06-07 14:56:06

标签: asp.net-mvc error-handling asp.net-mvc-partialview ajax.beginform

Thjere在这里可能是类似的问题而且我已经看到了一些解决方案,但是,它似乎并不是我正在寻找的。

我想在自己的自定义布局中显示错误页面。但是,在使用常规视图时,如果从View的控制器抛出异常,Ajax.BeginForm使用AjaxOptions将数据加载到PartialView,错误页面内容在使用主布局的视图内部加载。

此外,OnFailure选项不会触发CheckError javascript函数。 看起来永远不会调用该选项。

这是视图:

@using (Ajax.BeginForm("Index", "MyReport",
                new AjaxOptions
                {
                    HttpMethod = "POST",
                    InsertionMode = InsertionMode.Replace,
                    UpdateTargetId = "ajaxReportDiv",
                    LoadingElementId = "loader",
                    OnFailure = "CheckError"
                },
                new { id = "DateForm" }
                ))
{  
    @Html.Partial("_FileDate", Model)
}

<div>    
    <div id="ajaxReportDiv">
        @Html.Partial("Report", Model)
    </div>    
</div>

我将错误丢入控制器内进行测试:

[HttpPost]
public ActionResult Index(Models.MyModel1 model)
{
    if (ModelState.IsValid)
    {
        throw new HttpException(404, "Not Found");
        model = new Models.MyModel1().GetData(model.ID);
    }

    return PartialView("Report", model);
}

当抛出错误时,会调用Application_Error文件的Global.asax.cs方法,该方法会重定向到ErrorController

protected void Application_Error(object sender, EventArgs e)
{
    try
    {
        var error = Server.GetLastError(); 
        var code = (error as HttpException)?.GetHttpCode() ?? 500;
        Response.Clear();
        var result = new ApplicationLogModel().LogError(error, Request);
        Server.ClearError();
        Response.Redirect($"~/Error/Index?errorCode={code}");
    }
    catch
    {
        //
    }  
}

ErrorController根据引发的错误显示View

public ActionResult Index(int errorCode)
{
    ViewBag.IsAjaxRequest = Request.IsAjaxRequest();

    switch (errorCode)
    {
        case 404:
                return View("NotFound");
        default:
                return View("Error");
    }
}

请求是Ajax Request

在我的NotFound页面中,我指定了应该使用的布局:

Layout = "~/Views/Shared/_LoginLayout.cshtml";
ViewBag.Title = "NotFound"; 

看起来它正在使用所需的布局,但它被加载到主布局中。

我不确定这里的问题是什么。

0 个答案:

没有答案