MVC ActionResult - 可空或可选参数

5
当向我的MVC动作传递一个分页列表的页面编号时,并不需要提供一个页面编号。如果没有选择页面编号,该数字默认为第一页。
大多数文档似乎支持使用空值合并运算符,例如:
Public ActionResult Demo(int? page)
{
    const int pageSize = 10
    var model _db.Model.ToPagedList(page ?? 1, pageSize);
    return View(model);
}

或类似的东西。

我想知道使用这种方法是否比使用默认参数更有好处,例如:

Public ActionResult Demo(int page = 1)
{
    const int pageSize = 10
    var model _db.Model.ToPagedList(page, pageSize);
    return View(model);
}

甚至还可以

Public ActionResult Demo(int? page = 1)
{
    const int pageSize = 10
    var model _db.Model.ToPagedList(page.Value, pageSize);
    return View(model);
}

尽管在此实例中将页面设置为空类型似乎是多余的。

是否使用其中一种方法有任何特殊益处,还是仅仅是语法糖。

编辑:修复了第三个示例中的空异常。


1
至于最后一个选项,我不会说它是多余的,而是错误的——因为如果他们传递了 null ,那么 page 就会等于 null ,并且你可能会从 ToPagedList 方法中得到异常。 - Gilad Green
1
据我所知,1)在可选参数被支持之前的“旧”方式。当逻辑比简单的常量值更复杂时仍然需要。如果调用函数中决定了常量值并且需要“传播”空值,则也需要。2)如果客户端没有一种方法来表示“使用默认值”,但仍然发送参数,则通常采用这种方式。3)如果您需要一种让客户端表示“使用默认值”并发送参数的方法。2/3通常是等效的,但如果过度使用“哨兵”值可能会有害... - Adriano Repetti
1
另外,对于最后一个选项,您必须使用 page.Value,除非 .ToPagedList 恰好将其第一个参数用作 int? - Peter B
附注:请注意,“int?page”也将处理参数值无效的情况,而“int page”只会抛出错误。 - Adriano Repetti
1个回答

2

最后一个不合理 Public ActionResult Demo(int? page = 1)

根据您的情况,前两个操作方法没有任何区别,因为参数是页码。如果没有提供参数,人们希望着陆在第一页。

但是,如果您关心值,则不要使用可选参数。

public ActionResult UserDetails(int? id)
{
    if (!id.HasValue)
        return View("UserNotFound"); // Or return a message.

    int userId = id.Value; 
    var user = _userService.GetUserById(userId);
    // Do something
}

在上述情况下,您不能使用可选参数 - public ActionResult UserDetails(int id = 123)

FYI:如果未提供id,则不要使用public ActionResult UserDetails(int id)。否则会导致崩溃。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接