Thjere在这里可能是类似的问题而且我已经看到了一些解决方案,但是,它似乎并不是我正在寻找的。 p>
我想在自己的自定义布局中显示错误页面。但是,在使用常规视图时,如果从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";
看起来它正在使用所需的布局,但它被加载到主布局中。
我不确定这里的问题是什么。