При передаче нескольких значений для поля с использованием ajax (jQuery): как избежать получения «fieldName []» в запросе вместо «fieldName»? - PullRequest
0 голосов
/ 15 августа 2011

Я пытаюсь передать несколько значений для одного имени поля в вызов ajax:

<form>    
  <input type="hidden" name="fieldName" value="MyValue1">
  <input type="hidden" name="fieldName" value="MyValue2">
  <input type="hidden" name="fieldName" value="More data...">
  <input type="hidden" name="fieldName" value="More data...">
  <input type="hidden" name="fieldName" value="More data...">
  <input type="hidden" name="fieldName" value="More data...">
</form>

Я не могу просто отправить форму, потому что отправка должна быть выполнена с использованием ajax по причинам, которые не имеют отношения к этой ситуации.

Когда я сериализирую эти данные формы, я получаю следующее:

formData: Object
  fieldName: Array[6]
    0: "MyValue1"
    1: "MyValue2"
    2: "More data..."
    3: "More data..."
    4: "More data..."
    5: "More data..."
    length: 6

Пока это выглядит хорошо для меня. Вот где я отправляю это на сервер:

$.post("/MyHandler.axd", formData, function (data) {
       // etc.
});

На сервере код, который я не контролирую, делает следующее:

string[] values = request.Form.GetValues("fieldName");

В этот момент values равно нулю. Однако, если я сделаю это:

string[] values = request.Form.GetValues("fieldName[]");

values содержит мой массив длины 6 с правильными данными и т. Д.

Я понимаю, что здесь происходит, но я не знаю, почему и как я могу обойти это. Можно ли вытащить fieldName вместо fieldName[] без отправки формы?

Спасибо.

РЕДАКТИРОВАТЬ: После попытки предложений @ raymondralibi, я теперь получаю следующее:

Для первого предложения (getSerializeArray($(this).closest('form'))) я получаю это:

formData: Object
  : undefined
  __proto__: Object

И для второго (getSerializeArray2($(this).closest('form'))) я получаю это:

formData: Array[1]
  0: Object
    : undefined
    __proto__: Object
  length: 1
  __proto__: Array[0]

Возможно, я называю это неправильно; Какие-нибудь мысли? Еще раз спасибо.

Ответы [ 2 ]

0 голосов
/ 23 августа 2011

Что ж, я закончил тем, что все заработало, но мне не нравится, как я это сделал:

Перед тем, как код, который выполняет request.Form.GetValues("fieldName"), я делаю следующее:

    var entriesTable = typeof(System.Collections.Specialized.NameObjectCollectionBase).GetField("_entriesTable", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(HttpContext.Current.Request.Form) as System.Collections.Hashtable;
    entriesTable.Add("fieldName", entriesTable["fieldName[]"]);

Это копирует ArrayList в правильный ключ в хеш-таблице, и все работает отлично.Тем не менее, я бы предпочел, чтобы это было правильно передано со стороны клиента, но сейчас это работает.

0 голосов
/ 16 августа 2011

Надеюсь, это поможет.

// $.serializeArray() return [{name:fieldname, value:MyValue1}, ...]
// this function will return {fieldname:MyValue1, ...}
var getSerializeArray = function($serialize_array){
  var obj = {};
  for(var i=0; i<$serialize_array.length; i++){
    obj[$serialize_array[i].name] = $serialize_array[i].value;
  }
  return obj;
};

// and this function will return [{fieldname:MyValue1}, {fieldname:MyValue2}, ...]
var getSerializeArray2 = function($serialize_array){  
  var arr = [];  
  for(var i=0; i<$serialize_array.length; i++){    
    arr[i] = {};
    arr[i][$serialize_array[i].name] = $serialize_array[i].value;  
  }  
  return arr;
};

// just call
getSerializeArray($('form').serializeArray());
getSerializeArray2($('form').serializeArray());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...