【问题标题】:Web API Form Data CollectionWeb API 表单数据收集
【发布时间】:2012-11-16 07:42:14
【问题描述】:

我正在尝试将表单序列化值发布到控制器(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 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);
                }
        }
}

非常感谢。

【问题讨论】:

    标签: c# asp.net jquery asp.net-web-api


    【解决方案1】:

    试试 FormDataCollection,而不是 NameValueCollection。

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

    【讨论】:

      【解决方案2】:

      或者您可以使用构建“ReadAsNameValueCollection”,如下所示:

      NameValueCollection MyNameValueCollection = formData.ReadAsNameValueCollection();
      

      【讨论】:

      • 如果您需要 NameValueCollection,这听起来是个不错的方法。我认为您仍然希望您的控制器方法的参数是 FormDataCollection,对吧?
      【解决方案3】:

      谢谢斯科特。你的回答正是我所需要的。在此基础上,我编写了以下小实用程序方法,它将派上用场,因为它将所有数据值从流中提取出来(使用 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
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-30
        • 1970-01-01
        • 2021-03-14
        • 2020-04-28
        • 2022-01-10
        • 1970-01-01
        • 2013-09-01
        相关资源
        最近更新 更多