Страница ASP не получает параметры POST

Я пишу небольшое приложение в Classic ASP. У меня есть страница с формой, которая публикуется на второй странице. В состав POST формы входит загрузка файлов, поэтому необходим метод POST.

Однако вторая страница НЕ видит НИКАКИХ полей, отправляемых первой страницей. Вызов Request("param") или Request.Form("param") просто возвращает пустую строку.

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

В режиме GET все параметры помещаются в URL-адрес, как и ожидалось. В режиме POST я запустил FireBug и проверил данные POST моего запроса. Исходная форма IS отправляет все значения в запросе (они отображаются в FireBug, как и ожидалось), поэтому проблема, похоже, находится на стороне принимающей страницы.

Отправка формы осуществляется через код, вызываемый с кнопки с onclick="javascript:saveMinutes();"

Моя форма и функция saveMinutes() объявлены следующим образом:

<form id="frmMinutes" enctype="multipart/form-data" method="post" action="saveminutes.asp">
<table id="tblMinutes" style="width: 100%;">
    <tr>
        <td>
            <select id="selYear" name="year" size="13" onclick="javascript:setDatePickerRange(); checkForMinutes();">
                <%For lc = Year(Now) To getMinutesFirstYear() Step - 1%>
                    <option value="<%=lc%>" <%If lc = Year(Now) Then%>selected="selected"<%End If%>><%=lc%></option>
                <%Next%>
            </select>
        </td>
        <td>
            <select id="selMonth" name="month" size="13" onclick="javascript:setDatePickerRange(); checkForMinutes();">
                <%For lc = 1 To 12%>
                    <option value="<%=lc%>" <%If lc = Month(Now) Then%>selected="selected"<%End If%>"><%=MonthName(lc)%></option>
                <%Next%>
            </select>
        </td>
        <td style="width: 100%; padding-left: 20px;">
                <table id="enterMinutes" style="width: 100%">
                    <tr>
                        <th>Topic:</th>
                        <td><input id="topic" name="topic" type="text" maxlength="100" field="topic" /></td>
                    </tr>
                     <tr>
                        <th>Presenter:</th>
                        <td><input id="presenter" name="presenter" type="text" maxlength="100" field="presenter" /></td>
                    </tr>
                     <tr>
                        <th>Date:</th>
                        <td><input id="mtgdate" name="mtgdate" type="text" maxlength="10" class="datepick" field="mtgdate" readonly="readonly" /></td>
                    </tr>
                     <tr>
                        <th style="vertical-align: top;">Files:</th>
                        <td style="text-align: left;">
                            <input id="file0" name="file0" type="file" size="35" /><span class="redEmphasis" style="margin: 0px 10px 0px 10px;">(.doc or .docx)</span><input type="button" value="+" onclick="javascript:addFileUpload();" />
                        </td>
                    </tr>
                     <tr>
                        <th style="vertical-align: top;"></th>
                        <td style="text-align: left; padding: 10px 0px 10px 0px;">
                            <input type="button" style="width: 100%" value="update minutes" onclick="javascript:saveMinutes();" />
                        </td>
                    </tr>
               </table>
               <span id="warnexist" class="redEmphasis" style="display: none;">The selected month already has associated minutes (). doc files take precedence over docx.</span>
        </td>
    </tr>
</table>
</form>

сохранить минуты():

function saveMinutes() {
    if($('form#frmMinutes input[type=text]').filter(function () { return $(this).val() == '' }).length > 0) {
        alert('Please enter all fields.');
        return;
    }

    if ($('form#frmMinutes input#file0').filter(function () { return !$(this).val().match(/.*\.docx?$/i) }).length > 0) {
        alert('First file must be doc or docx.');
        return;
    }

    $('form#frmMinutes input[type=file]').filter(function () { return $(this).val() == '' }).next().remove();
    $('form#frmMinutes input[type=file]').filter(function () { return $(this).val() == '' }).remove();

    removeDupeFiles();

    // reindex file inputs after removing emptys/dupes
    var fs = $('form#frmMinutes input[type=file]:gt(0)');
    for (lc = 1; lc <= fs.length;  lc++) {
        var fid = 'file' + new String(lc);
        $(fs[lc-1]).attr('id', fid).attr('name', fid);
    }

    $('form#frmMinutes')[0].submit();
}

person eidylon    schedule 10.12.2009    source источник
comment
Если вы опубликуете код, который вы используете для извлечения загруженных файлов, это будет полезнее, чем то, что у вас есть здесь. Спасибо.   -  person Jacob Mattison    schedule 10.12.2009
comment
Я использовал только Request(param), я совершенно забыл о простых параметрах, которые также нужно было анализировать/декодировать. У меня есть класс, который я скачал для использования с файлами, просто не осознавал, что мне также нужно использовать его для простых входных параметров.   -  person eidylon    schedule 10.12.2009


Ответы (1)


Когда ваш from закодирован как составной, вы не можете получить значения POST как простые старые параметры. Они являются просто дополнительными частями составной формы.

Чтобы получить загруженные файлы в ASP, вам обычно приходится перебирать части и проверять каждую из них, чтобы убедиться, что это файл (и затем сохранить его, если это так). Чтобы получить значения поля, вы должны добавить к этому циклу проверку каждой части, чтобы увидеть, имеет ли она имя одного из ваших значений поля, а затем получить значение. Это очень сложно сделать в чистом ASP-коде, поэтому многие люди используют какой-либо компонент загрузки файлов, и в этом случае извлечение значений полей будет зависеть от компонента.

Но основное сообщение таково: какой бы анализ формы вы ни выполняли для извлечения файлов, вы должны делать то же самое для извлечения значений полей.

person Jacob Mattison    schedule 10.12.2009