Asp.net-Mvc

ASP.Net MVC - 處理錯誤的 URL 參數

  • March 2, 2016

處理建構自己的 URL 並用他們喜歡的任何東西替換我們期望的 ID 的訪問者的最佳方法是什麼?

例如:

ASP.Net MVC - 處理錯誤的 URL 參數

但使用者可以輕鬆地將 URL 替換為:

<https://stackoverflow.com/questions/foo>

我考慮過讓每個控制器函式參數 a String,並Integer.TryParse()在它們上使用 - 如果通過了,那麼我有一個 ID 並且可以繼續,否則我可以將使用者重定向到一個未知/未找到或索引視圖。

Stack Overflow 可以很好地處理它,我也想這樣做 - 你是怎麼做的,或者你有什麼建議?

這是一個像你這樣的路線的例子,對數量有限制:

routes.MapRoute(
   "Question",
   "questions/{questionID}",
   new { controller = "StackOverflow", action = "Question" },
   new { questionID = @"\d+" } //Regex constraint specifying that it must be a number.
);

這裡我們設置 questionID 至少有一個數字。這也將阻止任何包含除整數以外的任何 url,並且還可以防止需要可為空的 int。

*注意:*這不考慮大於 Int32 (-2147483647 - +2147483647) 範圍的數字。我將此作為練習留給使用者解決。:)

如果使用者輸入 url “questions/foo”,他們將不會點擊 Question 操作,並通過它,因為它失敗了參數約束。如果需要,您可以在包羅萬象/預設路由中進一步處理它:

routes.MapRoute(
   "Catchall",
   "{*catchall}", // This is a wildcard routes
   new { controller = "Home", action = "Lost" }
);

這會將使用者發送到 Home 控制器中的 Lost 操作。可以在此處找到有關萬用字元的更多資訊。

**注意:Catchall 應該作為 LAST 路由駐留。**考慮到 ASP.NET MVC 中路由的惰性特性,將其置於鏈的更上方意味著它將處理其下方的所有其他路由。

引用自:https://stackoverflow.com/questions/236349