2012-02-16 52 views
0

发布更新以反映@Kate建议的部分修复。原文帖子在新帖子下方:HttpPost上的ASP MVC3 HandleError

我有Ajax调用HttpPost的Action方法。如果该方法毫无例外地执行,我希望它将数据作为div元素中的部分视图加载(成功完成此操作)。如果出现异常,我希望它以完整页面视图的形式加载asp mvc错误视图。但是,使用下面的代码,异常会导致错误视图在所述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"); 
    } 
} 

想法?

ORIGINAL POST

在ASP MVC3 web应用程序,我要和[HttpPost]操作方法的AJAX调用。该方法命中数据库并将数据返回到局部视图。如果数据库或感兴趣的表已关闭,我想返回错误视图。但我似乎无法结合[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()。有什么我可以做的上面的方法导致错误视图呈现?或者我应该使用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:"); 
    } 
}); 

回答

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代码将捕获错误响应和重定向。

+0

谢谢,解决了问题的一部分,但不是全部。 Action方法执行成功,但将错误视图作为局部视图返回......我想将其作为整个页面呈现。我错过了其他的东西...... – rgwozdz 2012-02-17 00:03:06

+0

请指定您想要如何呈现该错误页面 - 作为Ajax请求的一部分,或者您只想重定向到其他页面。 – Kath 2012-02-17 00:25:17

+0

查看答案中的更新。 – Kath 2012-02-17 00:33:41

0

我不认为你可以从你的LoadUnmappedProjects动作中实现这一点,因为你正在做Ajax调用。在你的情况下,返回的错误页面被视为普通页面,因此你的ajax位的'成功'部分被执行。

如果发生异常,我宁愿试着返回一些标志(代码,空字符串,不管),并在'成功'部分检查并重定向到错误页面(如果你真的想做的话)从jQuery。

0

您仍然可以返回状态码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); 
    }  
}); 

我自己会处理错误,显示一些消息和不显示完整的错误页面,但选择权在你。凯特的答案也很稳定,将网址更改为错误页面。

+0

感谢您的解决方案,它也非常有帮助。 – rgwozdz 2012-02-17 14:02:49