2012-02-16 65 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