-1

我知道 Int 是一个不可为空的值,但是在 MVC 中我们使用了某些情况

public ActionResult Myfunction(int modelattr)
{
    if (modelattr != 0) // how is null handled as 0?
    {
        // do some code
    }
}

Null如何处理为0?

4

5 回答 5

9

一个int不可能null。时期。许多系统将0其用作“默认”值并在这种情况下应用特殊逻辑,但它不能为空。

CAN bu的int?(快捷方式),但您的示例没有使用它。Nullable<int>null

于 2013-07-10T13:24:38.473 回答
3

所以你真正要问的是,鉴于这条路线:

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

那么,id如果没有指定,控制器如何传递 0 值。

有(至少)两种可能性:

  1. 有一些代码检查缺少的 id 值并提供 0。例如,您的控制器的默认方法可以做到这一点。
  2. 还有另一个提供默认值的路由。

无论如何,没有任何东西可以将 null 转换为 0。当未指定 id 时,某处的代码会提供默认值。

于 2013-07-10T14:17:02.757 回答
3

结构不能为空并且int是结构intSystem.Int32BTW 的别名)。

如果您想知道如果您没有为该值分配任何东西(例如,您将 aint作为您从未设置的类的属性),则“默认”值是什么,您可以获得default(int).

如果您确实需要一个结构为空值,则可以使用Nullable包装器。通常这可以缩短为int?.

于 2013-07-10T13:30:48.580 回答
1

上面的答案为您提供了有关 int 不能为空的原因以及如何创建可为空的 int 的充分信息。但是,要解决您正在调查的问题(没有将 ID 传递给操作),您需要具备以下条件:

在您的路线配置中(注意可选的 ID 参数):

routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

然后调整您的控制器操作签名以匹配以下内容以及空值测试:

public ActionResult Myfunction(int? modelattr)
{
    if (modelattr.HasValue()) //this will test if the nullable int has a value or is null
    {
        // do some code
    }
}

最后,您可能希望反转 if 语句以减少代码执行块的嵌套,具体取决于您在参数为 null 时要执行的操作。例如:

public ActionResult Myfunction(int? modelattr)
{
    if (!modelattr.HasValue()) //this will test if the nullable int has a value or is null
    {
        //throw an exception or return a route to another page
    }
    //now do your processing, no need to have to stay inside of the if statement.
}
于 2013-07-10T16:39:55.847 回答
0

int 永远不会持有 null,因为它是不可为空的值类型。如果您愿意,请尝试为 int 分配一个空值,如下所示

        int i = null;

它会给你错误,
因为它不能将 null 转换为 'int',因为它是不可为空的值类型

于 2013-07-10T13:28:28.240 回答