2017-10-04 55 views
3

在ASP.NET MVC應用程序,當我們腳手架在Visual Studio中的控制器,我們得到的默認操作:爲什麼在某些默認MVC操作中id可爲空?

  • 指數
  • 創建
  • 刪除
  • 編輯
  • 詳細

上面幾個參數有一個可爲空的id(int? id):Details,Edit(GET version),Del ete,DeleteConfirmed。然後,至少在一些,有下面的代碼,以確保該ID不爲null:

if (id == null) 
{ 
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
} 

所有這些操作都需要一個ID;它不是可選的。您不能顯示任何內容或不刪除任何內容等。另外,如果狀態碼爲空,我們將生成一個BadRequest狀態碼。

那麼,爲什麼這些參數不是可以爲空的整數呢?

+4

Url是字符串,「id」是一個int。當路由中的參數不能轉換爲int時會發生什麼?是否應該是一些一般性錯誤,或者您的控制器是否應該指定如何處理無效(即空)的ID? – maccettura

+0

謝謝,@maccettura。但如果它是空的,我們應該拋出一個異常讓用戶知道。還是應該通過Visual Studio爲我們生成的檢查來檢測它? – Alex

+2

你應該總是拋出異常嗎?是否有應該發生的特殊處理?它應該被記錄?包含在MVC代碼中的樣板代碼僅僅是一個建議,並不是必需的。 – maccettura

回答

3

我相信這是因爲int的默認值是0。如果您按照您的建議將其設置爲int id,則模型綁定器將爲您提供默認值0,這意味着您無法區分0是實際提供的還是僅僅是默認的。

編輯:一直在想這個多一點。它是可選的,因爲它在通用路由模板的更高層次上定義 - 有些操作需要它,有些則不需要。

我錯了,像這樣的簡單參數爲0的默認值 - 請參閱註釋。

+0

嗯。根本沒有想到這一點。是的,'0'可以是一個有效的記錄ID,而'int? ID'真正提供空白/ null。 – Alex

+3

錯 - 它沒有提供例外拋出 –

+0

實際上,上面是不正確的:當我離開id空白並嘗試導航到一個頁面時,它簡直爆炸並說:'參數字典包含一個空條目對於'MyController'中方法'System.Threading.Tasks.Task'1 [System.Web.Mvc.ActionResult] Edit(Int32)'的非空類型'System.Int32'的參數'id'。可選參數必須是引用類型,可爲空類型,或者聲明爲可選參數。參數名稱:參數。所以這不是默認0 – Alex

相關問題