为什么在某些默认MVC操作中id可为空?
在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
状态码。
那么,为什么这些参数不是可以为空的整数呢?
我相信这是因为int
的默认值是0
。如果您按照您的建议将其设置为int id
,则模型绑定器将为您提供默认值0
,这意味着您无法区分0
是实际提供的还是仅仅是默认的。
编辑:一直在想这个多一点。它是可选的,因为它在通用路由模板的更高层次上定义 - 有些操作需要它,有些则不需要。
我错了,像这样的简单参数为0的默认值 - 请参阅注释。
嗯。根本没有想到这一点。是的,'0'可以是一个有效的记录ID,而'int? ID'真正提供空白/ null。 – Alex
错 - 它没有提供例外抛出 –
实际上,上面是不正确的:当我离开id空白并尝试导航到一个页面时,它简直爆炸并说:'参数字典包含一个空条目对于'MyController'中方法'System.Threading.Tasks.Task'1 [System.Web.Mvc.ActionResult] Edit(Int32)'的非空类型'System.Int32'的参数'id'。可选参数必须是引用类型,可为空类型,或者声明为可选参数。参数名称:参数。所以这不是默认0 – Alex
Url是字符串,“id”是一个int。当路由中的参数不能转换为int时会发生什么?是否应该是一些一般性错误,或者您的控制器是否应该指定如何处理无效(即空)的ID? – maccettura
谢谢,@maccettura。但如果它是空的,我们应该抛出一个异常让用户知道。还是应该通过Visual Studio为我们生成的检查来检测它? – Alex
你应该总是抛出异常吗?是否有应该发生的特殊处理?它应该被记录?包含在MVC代码中的样板代码仅仅是一个建议,并不是必需的。 – maccettura