MVC: Ошибка страницы открывается внутри основного макета при возникновении исключения в методе контроллера

Здесь могут быть похожие вопросы, и я думаю, что уже видел некоторые решения, однако, похоже, это не то, что я ищу.

Я хочу отобразить страницу с ошибкой в ​​собственном макете. Это работает при использовании обычного представления, когда исключение выдается из контроллера для 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 ответов

Другие вопросы по тегам