如何在MVC6ASP.NET5中使控制器接受来自主体的post数据以及URL

如何在MVC6ASP.NET5中使控制器接受来自主体的post数据以及URL,asp.net,asp.net-mvc,action,modelbinder,asp.net-core-mvc,Asp.net,Asp.net Mvc,Action,Modelbinder,Asp.net Core Mvc,目前,我正在尝试在MVC6中编写一个能够接受post请求数据的控制器。问题在于,根据客户机(并不总是web浏览器)的不同,数据可以在请求URL中以键值对的形式输入,也可以在请求正文中以JSON的形式输入 当前,此方法用于从URL接受数据: [HttpPost] public async Task<CaptureResponse> CaptureData(CaptureInfo capture) { ... } 为了简单起见,我想以某种方式将两者结合在一起,因此model b

目前,我正在尝试在MVC6中编写一个能够接受post请求数据的控制器。问题在于,根据客户机(并不总是web浏览器)的不同,数据可以在请求URL中以键值对的形式输入,也可以在请求正文中以JSON的形式输入

当前,此方法用于从URL接受数据:

[HttpPost]
public async Task<CaptureResponse> CaptureData(CaptureInfo capture) {
    ...
}
为了简单起见,我想以某种方式将两者结合在一起,因此model binder将在同一个参数变量中提供数据。到目前为止,将数据放入同一操作的唯一方法是指定两个参数,一个用于URL,另一个用于正文,并对每个参数执行一些空检查,如下所示:

[HttpPost]
public async Task<CaptureResponse> CaptureData(CaptureInfo capture, [FromBody] CaptureInfo bodyCapture) {
    if (bodyCapture != null) {
        if (bodyCapture.RequiredProperty1!= null
        && bodyCapture.RequiredProperty2!= null) {
            capture = bodyCapture;
        }
    }
    ...
}
[HttpPost]
公共异步任务CaptureData(CaptureInfo捕获,[FromBody]CaptureInfo bodyCapture){
if(bodyCapture!=null){
如果(bodyCapture.RequiredProperty1!=空
&&bodyCapture.RequiredProperty2!=null){
捕获=身体捕获;
}
}
...
}
我尝试在输入属性之前指定多个属性,如下所示:

[HttpPost]
public async Task<CaptureResponse> CaptureData(CaptureInfo [FromQuery][FromRoute][FromForm][FromBody] capture) {
    ...
}
[HttpPost]
公共异步任务CaptureData(CaptureInfo[FromQuery][FromRoute][FromForm][FromBody]捕获){
...
}

但它不起作用。如果可以这样做,你有什么想法吗?

你需要使用
请求。表单

比如:

   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();

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

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

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


对于熟悉REST的开发人员来说,向POST请求提交数据的“直观”方式是通过请求主体。我建议你考虑用这个方法作为唯一的方法。

这些方法看起来是静态的,HttpContext似乎不包含“当前”属性。我试图使用
(wait Context.Request.GetFormAsync())
,但它总是返回null。该方法似乎也不像默认的模型绑定器那样对类对象进行任何类型的解析或反序列化。
   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();