【问题标题】:MVC ActionResult - Nullable or Optional parameterMVC ActionResult - 可空或可选参数
【发布时间】:2017-03-16 01:22:06
【问题描述】:

将页码传递给分页列表的 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);
}

虽然在这种情况下将 page 作为可空类型似乎是多余的。

特别是使用其中一种方法有什么好处,还是只是语法糖。

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

【问题讨论】:

  • 至于最后一个选项,我不会说多余但错误 - 因为如果他们通过 null 那就是 page 将等于你可能会从 @987654326 得到一个例外@方法
  • AFAIK 1) 支持可选参数之前的 方式。当逻辑比简单的常量值更复杂时仍然需要。如果在被调用函数中确定常量值并且您需要传播 null 2)如果客户端无法说“使用默认值”但仍发送参数的常用方法3)如果您需要一种方式让客户端说“使用默认值”并发送参数。 2/3 通常是等效的,但如果使用过多,sentinel 值可能会有害...
  • 对于最后一个选项,您必须使用page.Value,除非.ToPagedList 恰好使用int? 作为其第一个参数。
  • 附录:注意“int?page”也会处理参数值为invalid的情况,而“int page”只会抛出错误

标签: c# asp.net-mvc nullable optional-parameters pagedlist


【解决方案1】:

最后一个没有意义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)

仅供参考:您不想使用public ActionResult UserDetails(int id)。如果没有提供 id 会导致崩溃。

【讨论】:

    猜你喜欢
    • 2013-12-17
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    相关资源
    最近更新 更多