2012-07-21 44 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

相關問題