12

フォームのシリアル化された値をコントローラー(Web APIセルフホスト)に投稿しようとしています。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セルフホストを使用するサーバー側:

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

どうもありがとう。

4

3 に答える 3

25

NameValueCollection の代わりに、FormDataCollection を試してください。

http://weblogs.asp.net/cibrax/archive/2012/08/10/binding-form-data-in-asp-net-web-api.aspx

于 2013-03-02T05:29:27.157 に答える
5

または、次のようにビルド「ReadAsNameValueCollection」を使用できます。

NameValueCollection MyNameValueCollection = formData.ReadAsNameValueCollection();
于 2015-06-24T07:30:46.847 に答える
4

ありがとうスコット。あなたの答えはまさに私が必要としていたものでした。それに基づいて、次の小さなユーティリティ メソッドを作成しました。これは、(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
 }
于 2014-10-15T23:03:25.510 に答える