今天花了很多时间试图围绕处理 Web 表单数据的旧方法和如何使用 WebAPI 完成之间的(重要但强大的)范式转变,我想我会在这个讨论中添加我的 2 美分.
我想要做的(这对于 POST 的 Web 表单处理很常见)是能够以任何顺序获取我想要的任何表单值。如果您将数据保存在System.Collections.Specialized.NameValueCollection
. 但事实证明,在 WebAPI 中,来自 POST 的数据以流的形式返回给您。所以你不能直接这样做。
但是有一个很酷的小类FormDataCollection
(在 System.Net.Http.Formatting 中),它可以让你做的是遍历你的集合一次。
所以我写了一个简单的实用方法,它将运行FormDataCollection
一次并将所有值粘贴到NameValueCollection
. 完成此操作后,您可以将所有数据跳到您心中。
所以在我的 ApiController 派生类中,我有一个这样的 post 方法:
public void Post(FormDataCollection formData)
{
NameValueCollection valueMap = WebAPIUtils.Convert(formData);
... my code that uses the data in the NameValueCollection
}
我的静态 WebAPIUtils 类中的 Convert 方法如下所示:
/// <summary>
/// Copy the values contained in the given FormDataCollection into
/// a NameValueCollection instance.
/// </summary>
/// <param name="formDataCollection">The FormDataCollection instance. (required, but can be empty)</param>
/// <returns>The NameValueCollection. Never returned null, but may be empty.</returns>
public static NameValueCollection Convert(FormDataCollection formDataCollection)
{
Validate.IsNotNull("formDataCollection", formDataCollection);
IEnumerator<KeyValuePair<string, string>> pairs = formDataCollection.GetEnumerator();
NameValueCollection collection = new NameValueCollection();
while (pairs.MoveNext())
{
KeyValuePair<string, string> pair = pairs.Current;
collection.Add(pair.Key, pair.Value);
}
return collection;
}
希望这可以帮助!