【问题标题】:Can a controller ever accept a null parameter value?控制器可以接受空参数值吗?
【发布时间】:2022-01-22 19:34:27
【问题描述】:

如果我有这样的控制器方法:

public ActionResult<Item> GetItem(RequestHeaderBase headers, RequestObject request)

我可以总是假设 headers 对象和 request 对象将被实例化(不为 null)吗?

(无论答案如何,我都希望有任何链接可以深入阅读有关其工作原理的任何链接)

这是我的意思的一个例子

我在这里调用请求:https://localhost:44360/weatherforecast,尽管我没有提供查询字符串,但您可以看到输入对象已被实例化。

另一个例子,这次是来自正文的数据:

在这两种情况下,你可以通过我的调试看到,无论实例化什么对象,即使我没有在请求中提供任何数据。

现在我在我们的一些应用程序中看到了检查此数据是否为空的代码,我认为此代码无关紧要,因此可以删除。

【问题讨论】:

  • 这听起来像是 XY 问题。你想达到什么目的?如果您尝试访问请求的属性,请使用HttpContext.Request,只要控制器调用来自 HTTP 请求,它就会被填充。 (可以从应用程序代码中调用控制器逻辑,但不推荐)。
  • 不是特别有问题,我看到一些代码检查这些参数之一是否为空,例如 if(request == null)... 但据我了解,来自任何来源的 http 请求将始终在控制器方法中实例化,只是想确认我是正确的。

标签: c# asp.net-core .net-core


【解决方案1】:

如果它是一个引用对象(不是一个值),它将总是被实例化。每个对象属性都有一个默认值。这就是为什么任何用于操作输入参数的类都应该具有默认或无参数构造函数。否则会引发异常。只有在创建对象时,控制器才会尝试根据 http 请求为对象属性分配值。但要小心,只有顶层会被实例化。如果您在此对象内部还有其他复杂的属性,它们将被实例化并根据类型具有默认值。例如,List 将为 null(默认值),而不是空列表。可为 Null 的整数属性将为 Null,不能为 Null 的 0,依此类推。但是你可以在构造函数中分配你需要的默认值。

即使您将操作签名更改为此

public ActionResult<Item> GetItem(RequestHeaderBase headers=null, RequestObject request=null)

它们仍然会被实例化,每个属性都会根据类型有一个默认值。

【讨论】:

    【解决方案2】:

    我可以总是假设 headers 对象和 request 对象将被实例化(不为 null)吗?

    不,它们可以为空。

    【讨论】:

    • 您好,您有示例或指向某些文档的链接给我看吗?
    • 我认为你需要阅读更多关于 HTTP 协议和 JSON 序列化的内容
    • @DubDub 如果是您要求的答案,请将答案标记为已接受
    • 不是的,你还没有给出例子或者解释为什么会这样。
    • 您问的是/否问题,我回答了您的问题。另外,我向您建议您应该阅读什么。哪一部分没有回答,或者您现在需要什么帮助?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多