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";
Похоже, что он использует необходимый макет, но он загружен внутри основного макета.
Я не уверен, что проблема здесь.