如何让控制器接受来自正文的帖子数据以及MVC 6 ASP.NET 5中的URL

时间:2015-01-05 03:34:53

标签: asp.net asp.net-mvc action modelbinder asp.net-core-mvc

目前我正在尝试在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,一个用于body,并对每个参数进行一些空检查,如下所示:

[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) {
    ...
}

但它不起作用。任何想法,如果有可能吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

&#34;直观&#34;向熟悉REST的开发人员提交数据到POST请求的方法是通过请求体。我建议你考虑采用这种方法作为唯一的方法。

答案 1 :(得分:-3)

您需要使用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();