4

目前我正在尝试在 MVC 6 中编写一个能够接受来自发布请求的数据的控制器。问题在于,根据客户端(并不总是 Web 浏览器),数据可能以请求 URL 中的键值对或请求正文中的 JSON 形式出现。

目前,此方法适用于接受来自 URL 的数据:

[HttpPost]
public async Task<CaptureResponse> CaptureData(CaptureInfo capture) {
    ...
}

经过大量试验和错误(以及堆栈溢出答案),我发现该[FromBody]属性告诉模型绑定器查看请求正文,这是现在需要的,因为 MVC 6 将 WebApi 和标准 MVC 结合在一起。以下代码在表单正文中解析来自 JSON 的数据:

[HttpPost]
public async Task<CaptureResponse> CaptureData([FromBody] CaptureInfo capture) {
   ...
}

为简单起见,我想以某种方式将两者结合在一起,因此模型绑定器为我提供了相同参数变量中的数据。到目前为止,我可以将数据放入同一个 Action 的唯一方法是指定两个参数,一个用于 URL,一个用于正文,并对每个参数进行一些 null 检查,如下所示:

[HttpPost]
public async Task<CaptureResponse> CaptureData(CaptureInfo capture, [FromBody] CaptureInfo bodyCapture) {
    if (bodyCapture != null) {
        if (bodyCapture.RequiredProperty1!= null
        && bodyCapture.RequiredProperty2!= null) {
            capture = bodyCapture;
        }
    }
    ...
}

我尝试在输入属性之前指定多个属性,如下所示:

[HttpPost]
public async Task<CaptureResponse> CaptureData(CaptureInfo [FromQuery][FromRoute][FromForm][FromBody] capture) {
    ...
}

但它不起作用。如果这样的事情是可能的,有什么想法吗?

4

2 回答 2

0

据我所知,这是不可能的。当然,您可以尝试使用变通方法,基本上自己完成所有请求解析。听起来不太好,是吗?

如果您真的想要按照自己的方式做事,我相信最好的方法是在控制器中有两个不同的端点和用于实际处理的私有方法。或者,也许,甚至可以将该方法提取到一个额外的抽象层中,其中 BlaBlaService(在您的情况下可能是 CaptureService)类负责所有的脏工作。有时将控制器层与业务逻辑分开是有意义的——例如,出于测试目的。

PS:您的想法与旧 .NET 和 PHP 时代的方法非常相似,相信我,这个特殊的想法并不是让那些时代变得美好的想法。你知道,MVC 非常类似于 REST 方法,因此控制器的每个端点都应该专用于自己的单一功能,并遵守单一且统一的“直观”协议。

对于熟悉 REST 的开发人员来说,将数据提交到 POST 请求的“直观”方式是通过请求正文。我建议您考虑将这种方法作为唯一的方法。

于 2016-08-15T14:02:14.797 回答
-4

你需要使用Request.Form

喜欢:

   string username = HttpContext.Current.Request.Form.GetValues("key1")[0].ToString();
    string password = HttpContext.Current.Request.Form.GetValues("key2")[0].ToString();
    string something = HttpContext.Current.Request.Form.GetValues("key3")[0].ToString();
于 2015-01-05T07:54:07.643 回答