2012-11-28 17 views
11

Próbuję opublikować szeregowane wartości do kontrolera (Web Host Self Host). Nie mogę zrozumieć, dlaczego kolekcja NameValueCollection nie jest poprawnie powiązana. po stronie klienta przy użyciu jQuery:Web Data Form Collection Data Collection

// 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) { 

       } 
     }); 
} 

po stronie serwera za pomocą Web API Własna 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); 
       } 
     } 
} 

Dziękujemy.

Odpowiedz

2

Dzięki Scott. Twoja odpowiedź była właśnie tym, czego potrzebowałem. Na tej podstawie napisałem poniższą małą użyteczną metodę, która przydaje się, gdy wyciąga wszystkie wartości danych ze strumienia (przy użyciu FormDataCollection) i umieszcza je w NamedValueCollection (do której można uzyskać dostęp w dowolnej kolejności).

/// <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 
} 
3

Albo można użyć build "ReadAsNameValueCollection", na przykład:

NameValueCollection MyNameValueCollection = formData.ReadAsNameValueCollection(); 
+1

Jeśli potrzebujesz NameValueCollection, brzmi to jak dobry sposób na uzyskanie. Myślę, że nadal chcesz, aby parametr metody kontrolera był FormDataCollection, ale prawda? –