Несколько полей формы с одинаковым атрибутом name не публикуются - PullRequest
2 голосов
/ 31 января 2012

Я имею дело с некоторыми устаревшими HTML / JavaScript. Некоторые из них находятся под моим контролем, некоторые из которых получены из места, которое я не могу контролировать.

Существует динамически генерируемая форма со скрытыми полями. Сама форма создается с помощью шаблона Velocity (Percussion Rhythmyx CMS), и JavaScript вставляет дополнительные скрытые поля формы. Конечным результатом являются скрытые поля формы, созданные с тем же атрибутом name. Данные помещаются в серверный код Java / JSP, о котором я знаю очень мало.

Я знаю, что поля формы, имеющие один и тот же атрибут name, действительны. По какой-то причине данные POSTed не распознаются серверной частью. Когда я проверяю строку POST, все ключи с одинаковыми именами не содержат данных.

Если я манипулирую кодом в моей среде разработки таким образом, что для данного имени существует только одно поле ввода, данные корректно помещаются на сервер. Проблема не согласована, иногда она работает просто отлично.

Что я могу сделать, чтобы гарантировать, что данные будут размещены? Кто-нибудь может придумать причину, почему этого не будет?

I should really update my answer and post code here, because POST requests without 
variable strings indicates the problem is on the client side.

Ответы [ 3 ]

1 голос
/ 31 января 2012

Как насчет этого:

<script type="text/JavaScript">
    function disableBlankValues()
    {
        var elements = document.getElementById("form1").elements;
        for (var i = 0; i < elements.length; i++)
        {
            if (elements[i].value == "")
                elements[i].disabled = true;
        }
    }
</script>

<form action="page.php" method="POST" onsubmit="disableBlankValues()" id="form1">
    <input type="hidden" name="field1" value="This is field 1."/>
    <input type="hidden" name="field1" value=""/>
</form>

<ч /> EDIT

Теперь я осознаю реальную проблему (несколько переменных с одним и тем же именем должны быть переданы в JSP в виде массива), и мое решение, вероятно, не в том, что ищет OP, но я оставляю это здесь на всякий случай чтобы помочь кому-то еще, кто наткнулся на этот пост.

0 голосов
/ 01 февраля 2012

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

По сути, я создал обработчик ONSUBMIT, который проверяет форму для повторяющихся скрытых полей и проверяет, что онивсе заполнены правильными данными.Похоже, это гарантирует, что строка POST содержит данные независимо от того, как форма отображается, и серверная часть Java, кажется, тоже довольна ею.

Я проверял это в следующих ситуациях:

  1. Код генерирует отдельные экземпляры скрытых полей (что иногда случается)
  2. Код генерирует несколько экземпляров скрытых полей
  3. Код не создает экземпляров скрытых полей (что должно никогда не случиться, но эй ...)

Мое условие 'else' содержит чуть-чуть магии MooTools, но в остальном это просто.

Может быть, кто-то найдет это полезным однажды ...

Спасибо за помощь!

<form method="post" name="loginform" id="loginform" action="/login" onsubmit="buildDeviceFP(this);">
    <script type="text/javascript">
        function insertFieldValues( fields, sValue )
        {
            if ( 'length' in fields ) 
            {
                // We got a collection of form fields
                for ( var x = 0; x < fields.length; x++ ) {
                    fields[x].value = sValue;
                }
            }
            else
            {
                // We got a single form field
                fields.value = sValue;
            }
        }

        function buildDeviceFP( oForm )
        {
            // Get the element collections for Device Fingerprint & Language input fields from the form.
            var devicePrintElmts = oForm.elements.deviceprint;
            var languageElmts    = oForm.elements.language;

            // 'devicePrintElmts' & 'languageElmts' *should* always exist.  But just in case they don't...
            if ( devicePrintElmts) {
                insertFieldValues( devicePrintElmts, getFingerprint() );
            } else if ( oForm.deviceprint ) {
                oForm.deviceprint.value = getFingerprint();
            } else {
                $('logonbox').adopt(
                    new Element( 'input', {'type':'hidden', 'name':'deviceprint', 'value':getFingerprint()} )
                );
            }

            if ( languageElmts) {
                insertFieldValues( languageElmts, getLanguage() );
            } else if ( oForm.language ) {
                oForm.language.value = getLanguage();
            } else {
                $('logonbox').adopt(
                    new Element( 'input', {'type':'hidden', 'name':'language', 'value':getLanguage()} )
                );
            }
        }
    </script>
0 голосов
/ 31 января 2012

вы можете использовать что-то вроде:

var form = document.getElementById('yourformid');
var elements = form.getElementsByName('repeatedName');
var count = 0;
for(var item in elements){
   elements[item].name += count++;
}

таким образом вы получите каждое скрытое поле с именами:

name0
name1
name2
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...