Сегодня, проведя довольно много времени, пытаясь обернуть мой мозг вокруг (значительного, но мощного) смещения парадигмы между старыми способами обработки данных веб-формы и тем, как это делается с помощью WebAPI, я думал, что добавлю свои 2 цента к этому обсуждению.
То, что я хотел сделать (что довольно часто используется для обработки веб-форм POST), заключается в том, чтобы иметь возможность захватывать любые значения форм, которые я хочу, в любом порядке. Скажите, что вы можете сделать, если у вас есть данные в файле 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 выглядит следующим образом:
/// <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;
}
Надеюсь, что это поможет!