2017-10-04 80 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

相关问题