发布更新以反映@Kate建议的部分修复。新帖子下方的原帖:
我有Ajax调用HttpPost Action方法。如果该方法无异常执行,我希望它将其数据作为div元素中的局部视图加载(它成功完成)。如果有异常,我希望它将asp mvc Error视图加载为整页视图。但是,使用下面的代码,异常会导致Error视图作为所述div元素中的部分视图加载。我必须离开我的控制器......
[HttpPost]
[HandleError]
public ActionResult LoadUnmappedProjects()
{
bool error = false;
try
{
throw new ArgumentException();
}
catch (Exception e)
{
error = true;
}
if (!error)
using (var db = new prismEntities())
{
return PartialView(db.dmPSPProjectStatewideRegionals.ToList());
}
else
{
return View("Error");
}
}
思想???
原始帖子
在ASP MVC3网络应用程序中,我有一个ajax调用和[HttpPost]操作方法。该方法命中数据库并将数据返回到局部视图。如果数据库或感兴趣的表格已关闭,我想返回错误视图。但我似乎无法在方法上结合[HttpPost]和[HandleError]来实现这一点:
[HttpPost]
[HandleError]
public ActionResult LoadUnmappedProjects()
{
try
{
throw new ArgumentException();
}
catch (Exception e)
{
throw new CustomDbException(e);
}
using (var db = new prismEntities()){
return PartialView(db.dmPSPProjectStatewideRegionals.ToList());
}
}
股票Error.cshtml没有呈现。相反,错误会返回到Ajax调用,目前我只是弹出一个alert()。我可以对上面的方法做些什么来使Error视图呈现?或者我应该使用Ajax调用中返回的错误以某种方式呈现错误视图?
这是我的ajax电话:
$.ajax({
url: pathLoadUnmappedProjects,
type: 'POST',
dataType: 'html',
contentType: 'application/json; charset=utf-8',
success: function (result) {
$('#unmappedProjects').html(result);
},
error: function () {
alert("Error:");
}
});
答案 0 :(得分:1)
问题在于您的代码。因为抛出异常,它会自动停止进程并返回500错误服务器(您可以检查Firebug中的Net选项卡以查看它)。所以,我的建议不是在这里抛出异常:
throw new ArgumentException();
You can something like that:
try
{
...
}
catch (Exception e)
{
error = true;
}
if (error)
{
// render Error page
}
如果您需要重定向到某个页面,只需尝试返回您要重定向到的页面名称,并按照此处所述的JS代码执行:How to reload page when an ajax request returns FormsAuthentication.RedirectToLoginPage?
所以你的代码看起来像:
error: function () {
window.location.href = "Error/Index";
}
在这种情况下,您可以像以前一样抛出异常,ajax代码将捕获错误响应和重定向。
答案 1 :(得分:1)
您仍然可以返回状态代码500并让AJAX调用处理错误。
你的行动:
public ActionResult LoadUnmappedProjects()
{
bool error = false;
try
{
throw new ArgumentException();
}
catch (Exception e)
{
error = true;
}
if (!error)
using (var db = new prismEntities())
{
return PartialView(db.dmPSPProjectStatewideRegionals.ToList());
}
else
{
Response.StatusCode = 500;
return View("Error");
}
}
然后是你的AJAX电话:
$.ajax({
url: pathLoadUnmappedProjects,
type: 'POST',
dataType: 'html',
contentType: 'application/json; charset=utf-8',
success: function (result) {
$('#unmappedProjects').html(result);
},
error: function (xhr, ajaxOptions, thrownError) {
$('html').html(xhr.responseText);
}
});
我自己会处理错误,显示一些消息,而不显示完整的错误页面,但选择权在您手中。 Kate的答案也很可靠,将URL更改为错误页面。
答案 2 :(得分:0)
我认为您无法通过LoadUnmappedProjects操作实现这一点,因为您正在进行Ajax调用。在您的情况下,返回的错误页面被视为正常页面,因此执行ajax位的“成功”部分。
我宁愿尝试返回一些标志(代码,空字符串,无论如何),如果是异常,并在“成功”部分检查并重定向到错误页面(如果你真的想这样做)来自jQuery。