2011-11-18 64 views
2

當我問這個問題時,我主要考慮的是不好的參數。參數其中:在ASP.NET MVC中我應該重定向到錯誤頁面還是僅返回錯誤視圖?

  • int < = 0
  • string是空的或空白
  • 模型綁定對象缺少關鍵屬性
  • ID未發現錯誤」( 「有效」 整數id傳遞給動作,但沒有對應的數據庫記錄)

這裏有兩個錯誤處理的情況我說的是:

public ActionResult GoToError(int value, string name) 
{ 
    if (value <= 0 || string.IsNullOrWhiteSpace(name)) 
    { 
     // Parameter(s) not meeting basic conditions 
     TempData["ErrorMessage"] = "Invalid parameters"; 
     return RedirectToAction("Index", "Error"); 
    } 

    return View(); 
} 

public ActionResult ReturnView(int value, string name) 
{ 
    if (value <= 0 || string.IsNullOrWhiteSpace(name)) 
    { 
     // Parameter(s) not meeting basic conditions 
     ViewData["ErrorMessage"] = "Invalid parameters"; 
     return View("Error"); 
    } 

    return View(); 
} 

回答

1

有不同的情況,需要進行不同的處理:

  • 對於完全意外錯誤你沒有預料到,我建議讓異常泡沫起來,在Controller.OnException(...) method處理它, /或asp.net custom error pages
  • 對於常見的錯誤,預計,如用戶提供不良的輸入,其正確的返回視圖和顯示錯誤通過ModelState.Errors
  • 如果該動作的目標是通過AJAX/Javascript /作爲服務調用,則需要協調您發回的內容。它可能是一個自定義的JSON對象或特定的視圖。

根據您發佈的內容,我無法對它們「預期」或「未預料到」的天氣進行分類。主要問題是,這些調用的客戶端如何處理它們?

0

RESTful應用程序中,你應該返回查看和設置相應的HTTP狀態代碼(401,403,404,500,...) 。當你重定向這意味着狀態代碼200和返回錯誤頁面的狀態代碼200沒有意義。這裏是我用來處理錯誤的technique。當您可以訂閱不同的狀態代碼時,這對AJAX也很好。例如,假設您有一個經過身份驗證的網站,登錄用戶可以執行AJAX請求。在某些不活動之後,他們的會話可能會過期,並且如果您的服務器未返回適當的狀態代碼(在這種情況下爲401),他們需要執行一些AJAX請求時,客戶端腳本將難以理解和處理場景。

0

在ASP.NET中正確執行錯誤只是缺乏噩夢 - 很難。

如果你按照網站是爲了做:

您應該返回一個錯誤的結果對於任何無法從錯誤中恢復,像400錯誤的請求,404未找到資源等,這包括大多數的4xx範圍內的錯誤。

對於會導致500錯誤的未處理異常的應用程序錯誤,正確的解決方案是發出302重定向到正確返回500狀態碼的錯誤頁面。

正如@Darin Dimitrov所說,在RESTful應用程序中,您絕不應該爲任何事情發出重定向,它總是應該始終返回結果。

相關問題