使用 MVC 从 POST 的主体绑定单个值
Binding single value from the body of a POST with MVC
我正在 ASP.NET MVC 中实现一个协议,我需要能够从这样的请求中绑定数据:
curl -H "Content-Type: application/json" -d 'true' http://example.com/operation/some_id
我试过在我的控制器中使用参数的 [FromBody]
属性,如下所示:
public ActionResult Operation(string id, [FromBody] bool setSomething)
上面的代码不起作用,因为它在 MVC 尝试将 setSomething
设置为 null
时抛出异常。如果我将 setSomething
更改为字符串,它总是设置为 null
,因此我无法在操作中将其解析为布尔值。
我没有将 'true'
更改为 '=true'
的奢侈,正如我在其他地方看到类似问题时所读到的那样。从上面的 curl 命令生成的 POST 是一成不变的。我需要的是从 POST 的正文中获取值 true
(这是有效的 json,即使没有密钥)并将其分配给 setSomething
。我还需要以不阻止我将 some_id
分配给 id
的方式执行此操作,因为我已经在使用自定义路由。
有谁知道如何在 MVC 或 Web API 中实现这一点?
感谢任何帮助。
我找到了解决方案,但它更像是一种解决方法。
当 POST 的主体只是 true
或 false
但仅此而已时,没有绑定此值的键。因此,除了通过 JSON 反序列化器 运行 值之外,MVC 实际上没有任何它可以做的事情,它在没有在操作中设置任何参数的情况下成功。
最后只好直接从Request中读取值,如所述。
我最终使用了类似的代码:
public ActionResult Operation(string id)
{
var req = Request.InputStream;
req.Seek(0, SeekOrigin.Begin);
string rawBody = new StreamReader(req).ReadToEnd();
bool setSomething = false;
if(bool.TryParse(rawBody, out setSomething))
{
// Do something with 'setSomething'
return Json(new { id = id, status = setSomething });
}
throw new ArgumentException(string.Format("{0} is not a valid boolean value", rawBody));
}
如您所见,我从参数列表中完全删除了 setSomething
,并依靠读取请求的原始输入流来获取值。这一点也不优雅,也没有利用我们从 MVC 框架中获得的所有好处,但它确实有效。
我正在 ASP.NET MVC 中实现一个协议,我需要能够从这样的请求中绑定数据:
curl -H "Content-Type: application/json" -d 'true' http://example.com/operation/some_id
我试过在我的控制器中使用参数的 [FromBody]
属性,如下所示:
public ActionResult Operation(string id, [FromBody] bool setSomething)
上面的代码不起作用,因为它在 MVC 尝试将 setSomething
设置为 null
时抛出异常。如果我将 setSomething
更改为字符串,它总是设置为 null
,因此我无法在操作中将其解析为布尔值。
我没有将 'true'
更改为 '=true'
的奢侈,正如我在其他地方看到类似问题时所读到的那样。从上面的 curl 命令生成的 POST 是一成不变的。我需要的是从 POST 的正文中获取值 true
(这是有效的 json,即使没有密钥)并将其分配给 setSomething
。我还需要以不阻止我将 some_id
分配给 id
的方式执行此操作,因为我已经在使用自定义路由。
有谁知道如何在 MVC 或 Web API 中实现这一点?
感谢任何帮助。
我找到了解决方案,但它更像是一种解决方法。
当 POST 的主体只是 true
或 false
但仅此而已时,没有绑定此值的键。因此,除了通过 JSON 反序列化器 运行 值之外,MVC 实际上没有任何它可以做的事情,它在没有在操作中设置任何参数的情况下成功。
最后只好直接从Request中读取值,如所述。
我最终使用了类似的代码:
public ActionResult Operation(string id)
{
var req = Request.InputStream;
req.Seek(0, SeekOrigin.Begin);
string rawBody = new StreamReader(req).ReadToEnd();
bool setSomething = false;
if(bool.TryParse(rawBody, out setSomething))
{
// Do something with 'setSomething'
return Json(new { id = id, status = setSomething });
}
throw new ArgumentException(string.Format("{0} is not a valid boolean value", rawBody));
}
如您所见,我从参数列表中完全删除了 setSomething
,并依靠读取请求的原始输入流来获取值。这一点也不优雅,也没有利用我们从 MVC 框架中获得的所有好处,但它确实有效。