2012-07-03 255 views
1

我有一個路線:優雅的方式

 routes.MapRoute("ResetPasswordConfirm", "reset-password-confirm", new { controller = "Membership", action = "ResetPasswordConfirm" }); 

和代碼

public ActionResult ResetPasswordConfirm(int userid, string key) 
    { 
     // ... 
    } 
在我的應用程序

。所以,我有URL以這樣的方式執行:

http://localhost/reset-password-confirm?userid=1&key=bla_bla_something 

這絕對是好的,直到有人決定去

http://localhost/reset-password-confirm 

...看看會發生什麼。 ASP.NET將產生可預測的錯誤:

The parameters dictionary contains a null entry for parameter 'userid' of non-nullable type 'System.Int32'...

它也可以通過搜索機器人嘗試抓取所有可能的URL。沒關係,但在野外使用應用程序時會產生很多錯誤。我想避免這種情況,但對於爲這類錯誤的每種可能情況編寫一個存根感覺不舒服。

有沒有什麼優雅的方式呢?謝謝。

回答

2

另一種方式是處理全球性的錯誤,只要設置<customErrors mode="On"></customErrors>web.config並創建Error.cshtml在您的Shared視圖文件夾中。 MVC3模板實際上包含該頁面。另一方面,如果你想要更具體,你應該嘗試Action Filters,這是一個很酷的方式來處理錯誤。

[HandleError(View = "YourErrorView", ExceptionType=typeof(NullReferenceException))] 
public ActionResult ResetPasswordConfirm(int? userid, string key) 
{ 
     if (!userid.HasValue) 
     throw new NullReferenceException(); 
     // ... 
} 
1

使用nullables爲您的參數,即:

公衆的ActionResult ResetPasswordConfirm(INT用戶ID,串鑰匙?)

+0

你也可以使用默認值,當然你必須讓它們保持最後的限制,例如, 'public ActionResult ResetPasswordConfirm(string key,int userid = 0)' – bhamlin