HttpPost上的ASP MVC3 HandleError

时间:2012-02-16 19:50:51

标签: ajax asp.net-mvc razor error-handling

发布更新以反映@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:");
    }
});

3 个答案:

答案 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。