2012-06-07 6 views
5

Возможно ли иметь значение скрытого поля ввода в качестве массива, а затем передать его в контроллер Spring MVC?Скрытый входной массив Javascript

function foo(){ 
var myArray = new Array(); 
myArray[0] = "Hello"; 
myArray[1] = "World!"; 
document.getElementById("hiddenInp").value=myArray; 
} 

А затем в контроллере сделать что-то вроде

@RequestMapping ... 
public String test(HttpServletRequest request){ 
String[] myArray = request.getParameter("hiddenInp"); 
// Assuming that the name of the hidden input field is also hiddenInp 
System.out.println(myArray[0] + myArray[1]); 
... 
} 

Как насчет, если я работаю с ассоциативным массивом? Если индексы являются строковыми, а не int

+0

JavaScript не имеет ассоциативных массивов. – Sampson

+0

@JonathanSampson Возможно, я использую неправильный термин. Я имел в виду, вместо индекса, такого как «0» и «1», я делаю 'myArray [" A "] =" Hello ";'. Я знаю, что это работает, потому что я попробовал 'alert (myArray [" A "])', и он дает мне всплывающее окно с «Hello». – szrrizvi

+0

@JonathanSampson: Но объекты могут быть (и используются) в качестве карт ... – Bergi

ответ

13

Ваш лучший вариант: stringify массив, а затем назначить его.

element.value = JSON.stringify(["Hello", "World"]); 

Полученное значение будет JSON строку, которая затем может быть проанализирован на сервере, воссоздающий массив. Этот подход работает и для объектов, если вы хотите иметь нечто похожее на ассоциативный массив.

Следует отметить, что в то время как JSON имеет довольно хорошую поддержку в браузерах сегодня, старые браузеры могут не поддерживать его. Вы можете polyfill the feature fairly easily в таких случаях:

+1

не требуется. установка значения в виде массива будет делать именно то, что делает .join(). использование .join() - просто дополнительная обработка для ничего. – Ian

+0

@ianpgall Отмечено. Я, как правило, забываю, что JavaScript будет автоматически обрабатывать литье массива на соответствующий тип и значение. – Sampson

+0

Я не ожидал, что это сработает - я подумал, что это может включать в себя «[» и «]», но в любом случае это работает как .join(). не проблема, просто хотел указать на это! – Ian

1

Однако вы установили его в Javascript, вам придется разбирать его на сервере. Вероятно, это означает разделение значения на «,» на массив C#, а затем доступ к нему, как вы хотите. Все значения, отправленные в форме, отправляются как строка точно как есть.

Возможно, вы захотите использовать http://www.w3schools.com/jsref/jsref_join.asp, чтобы установить значение скрытого ввода. Это не обязательно, хотя, кажется, все в порядке, не используя .join(). Но важно помнить, что значение будет строкой на сервере, а не массивом.

+0

взгляните на http://w3fools.com/ – Bergi

+0

Да, я видел это давно. Хотя я думаю, что это смешно, это не имеет никакого отношения к использованию w3-школ для простых ссылок. Я предоставил ссылку, чтобы OP мог правильно использовать синтаксис, а не как решение (тем более, что я говорю .join() не следует использовать). – Ian

1

Вы можете передавать только строку как параметр, так и значение ввода. Это означает, что вы автоматически преобразуете Array в строку, присоединив ее к «;», вы можете сделать это вручную с помощью .join() method.

Сервера вам потребуется разбить эту строку на выбранный разделитель.

Если вы хотите, чтобы отправить их в виде массива, AFAIK вам понадобятся два входных элементов:

<input type="hidden" name="hiddenInp[]"<!-- should be more descriptive --> value="a" /> 
<input type="hidden" name="hiddenInp[]"<!-- the same name --> value="b" /> 
+0

вы можете установить значение ввода как массив. javascript в основном делает то, что .join() ДОЛЖНО делать, но нет необходимости использовать .join(), если вам не нужен разделитель, отличный от «,» – Ian

+0

Это именно то, что я сказал. Тем не менее, я бы даже использовал .join (","), чтобы было ясно, что я устанавливаю строку. – Bergi

0

Я нашел ответ в помощью следующей link.

Если вы хотите назначить любой объект JavaScript или массив сделать это следующим образом:

var javascript_variable = 'object' or ['fruit1', 'fruit2', 'fruit3']; 
$('#hiden_input_element_unique_id').val(JSON.stringify(javascript_variable)); 

После отправки формы, в ServerSide мы должны расшифровать следующим образом:

$fruits_array = json_decode($_POST['hiden_input_element_unique_name']); 

Этот вы можете получить любой массив JavaScript на стороне сервера, который вы установите внутри элемента формы через JavaScript, на стороне клиента!

+0

@Flexo спасибо за руководство и редактирование! Следуйте за этим тем временем! :-) –

Смежные вопросы