2012-11-28 3 views
11

양식을 serialize 된 값을 컨트롤러 (Web API 자체 호스트)에 게시하려고합니다. NameValueCollection이 올바르게 바인딩되지 않은 이유를 이해할 수 없습니다. jQuery를 사용하여 클라이언트 측 :웹 API 양식 데이터 수집

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

       } 
     }); 
} 

서버 측 사용하여 웹 API 자체 호스트 :

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); 
       } 
     } 
} 

많은 감사합니다.

답변

2

감사합니다 스콧. 당신의 대답은 내가 필요로하는 것이 었습니다. 이를 기반으로 모든 데이터 값을 스트림 (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 
} 
3

또는 당신은이 같은 빌드 "ReadAsNameValueCollection", 사용할 수 있습니다

NameValueCollection MyNameValueCollection = formData.ReadAsNameValueCollection(); 
+1

NameValueCollection이 필요한 경우 얻을 수있는 좋은 방법 인 것 같습니다. 난 아직도 컨트롤러 메서드의 매개 변수가 FormDataCollection이 되길 바랄 것 같은데? –