2012-07-21 89 views

回答

32

ASP.NET Web API在处理不同的HTTP场景(尤其是流媒体)方面变得更加健壮。因为只有媒体类型的格式化程序通常会触及内容并且必须使内容保持一致。

在ASP.NET MVC,application/x-www-form-urlencoded内容类型是一等公民(特别是治疗,因为这是对POST请求的95%的内容类型),我们有FormsCollection提供接入字典访问,每当它被定义为输入参数。

在ASP.NET Web API中,application/x-www-form-urlencoded是另一种内容类型,应该由其MediaTypeFormatter读取。由于此类ASP.NET Web API无法对Forms进行任何假设。

ASP.NET Web API中的常规方法是将窗体表示为模型,以便媒体类型格式化程序对其进行反序列化。另一种方法是定义动作的参数为NameValueCollection

public void Post(NameValueCollection formData) 
{ 
    var value = formData["key"]; 
} 
+1

假设你有被称为是一些值,有的认为是动态的。是否有一种方法可以为已知模型指定模型类型,并将其余部分放在集合中。像这样:'公共无效后(PostData模型,NameValueCollection formData)'? – 2014-03-14 19:50:09

+5

使用NameValueCollection对我不起作用,但它与FormDataCollection – Pyfhon 2016-11-30 09:36:05

+3

一起使用NameValueCollection对我也不起作用。我使用FormDataCollection作为@Pyfhon。 – avidProgrammer 2017-02-19 16:36:04

17

嗯,这是不可能的,因为HttpRequestMessage不提供该类型的集合开箱。

但是,如果你的应用ASP.NET主持下,你可以得到当前HttpContext对象,并从那里得到的表单值:

public class CarsController : ApiController { 

    public string[] Get() { 

     var httpContext = (HttpContextWrapper)Request.Properties["MS_HttpContext"]; 
     var foo = httpContext.Request.Form["Foo"]; 

     return new string[] { 
      "Car 1", 
      "Car 2", 
      "Car 3" 
     }; 
    } 
} 

但我不知道这是最好的方法做这种东西。

+1

它不适合我。在'foo'中返回null。 – 2014-02-18 13:17:45

4

作为替代Aliostad的方法,可以这样做:

public void Post(HttpRequestMessage request) 
{ 
    NameValueCollection formData = await request.Content.ReadAsFormDataAsync(); 
} 
-1

试试这个:

HttpContext.Current.Request.Form["key"]; 
+0

HttpContext在WebApi应用程序中不可用。 – McGuireV10 2017-12-16 21:02:52

相关问题