Сбор данных формы Web API
Я пытаюсь опубликовать сериализованные значения формы на контроллере (Web Host Self Host). Я не могу понять, почему NameValueCollection не правильно связаны. Клиентская сторона, использующая jQuery:
// Form Submit Handler
$( '#form-parameters' ).submit(function (event) {
event.preventDefault();
var formData = $(this).serialize();
// Post serialized form data
postAssemblyParameters(formData);
});
// Post Form Data to controller test
function postAssemblyParameters(formData){
$.ajax({
url: http://localhost/api/test/1,
type: 'POST',
data: formData,
dataType: 'application/x-www-form-urlencoded',
success: function(x3d) {
},
error: function(xhr) {
}
});
}
Серверная сторона, использующая Web API Self Host:
public void Post([FromUri] int id, [FromBody] NameValueCollection formData)
{
Console.WriteLine(id); // OK
// Collection is NULL
foreach (var key in formData.AllKeys)
{
foreach (var val in formData.GetValues(key))
{
Console.WriteLine(key + ": " + val);
}
}
}
Большое спасибо.
3 ответа
Вместо NameValueCollection попробуйте FormDataCollection.
http://weblogs.asp.net/cibrax/archive/2012/08/10/binding-form-data-in-asp-net-web-api.aspx
Или вы можете использовать сборку "ReadAsNameValueCollection", например так:
NameValueCollection MyNameValueCollection = formData.ReadAsNameValueCollection();
Спасибо Скотт. Твой ответ был именно тем, что мне было нужно. Основываясь на этом, я написал следующий небольшой служебный метод, который пригодится, когда он извлекает все значения данных из потока (используя FormDataCollection) и помещает их в коллекцию NamedValueCollection (к которой вы можете обращаться в любом порядке, в котором вы хотите).
/// <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
}