HTML-форма не содержит название кнопки отправки формы при использовании клавиши ввода - PullRequest
3 голосов
/ 21 декабря 2011

Мой веб-сайт MVC3 имеет код на стороне сервера, который проверяет название кнопки отправки, нажатой для отправки формы. Код работает, когда я использую мышь, чтобы нажать кнопку, но когда я использую клавишу ввода, форма get публикуется, но запрос не содержит названия кнопки отправки.

Есть ли какой-нибудь атрибут, который я могу установить для кнопки отправки, чтобы он работал как для нажатия, так и для использования клавиши ввода?

Вот мой HTML

<div>Search:</div>
  <form action="/Item/Search" method="post">        
    <input class="fulltextsearch" id="FTSearchText" name="FTSearchText" type="text" value="" />        
     <input type="submit" value="Go" name="FTSearchButton" />
  </form>
</div>

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

        //See if the value provider has the required prefix
        var hasPrefix = bindingContext.ValueProvider.ContainsPrefix(bindingContext.ModelName);
        var searchPrefix = (hasPrefix) ? bindingContext.ModelName + "." : string.Empty;

        var searchButton = GetValue(bindingContext, searchPrefix, "FTSearchButton");
        //If this value doesn't have value, the user didn't click the button so exit
        if (string.IsNullOrEmpty(searchButton)) {
            return null; 
        }

    private static string GetValue(ModelBindingContext context, string prefix, string key) {
        var result = context.ValueProvider.GetValue(prefix + key);
        return result == null ? null : result.AttemptedValue;
    }

EDIT Итак, вот проблема, с которой я столкнулся. У меня есть страница, которая отображает список предметов. У меня есть текстовое поле «Поиск» и кнопка отправки в виде HTML. Когда пользователь вводит текст в текстовое поле и нажимает кнопку поиска или использует клавишу ввода, страница отправляет данные формы через http get и возвращает первые 8 найденных записей. Затем страница отображает ссылки на страницы для дополнительных страниц. Проблема заключается в том, что когда пользователь щелкает ссылку на страницу, все данные формы остаются пустыми, и информация моего фильтра теряется (форма не публикуется со значением формы при использовании этих ссылок). Поэтому в итоге я отображаю пустой список элементов (при пустом поиске возвращается 0 результатов) вместо разбивки на страницы.

Добавив проверку для имени кнопки в моих данных формы, я мог определить, нужно ли просто публиковать данные или выполнить новый поиск.

Надеюсь, это имеет смысл.

Ответы [ 2 ]

4 голосов
/ 21 декабря 2011

Я бы на это не полагался. Есть много задокументированных ошибок с этим сценарием. Почему бы просто не добавить скрытое поле с name='submit'? Таким образом, было бы не сложно перекодировать бэкэнд.

<input type='hidden' name='submit' value='FTSearchButton'/>
3 голосов
/ 21 декабря 2011

Итак, я исследовал это прошлой ночью и почти что-то получил. Тогда этим утром я действительно где-то оказался, и вот где я оказался.

Очевидно, что стандарты W3C для отправки форм довольно слабы при описании функциональности, связанной с кнопкой Enter и отправкой форм. Кажется, они определили, что

'Когда в форме есть только одно однострочное поле ввода текста, пользовательский агент должен принять Enter в этом поле как запрос на отправку формы.'

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

Проблема, с которой я столкнулся, более или менее уникальна для IE, и только в том случае, если форма содержит один однострочный элемент управления вводом текста. По какой-то причине Microsoft решила, что когда IE отправляет такую ​​форму, она не включает пару имя / значение кнопки отправки в теле сообщения. Тем не менее, он включает пару имя / значение кнопки, если пользователь нажимает кнопку отправки --OR-- использует клавишу ввода, а форма содержит более одного однострочного элемента управления вводом текста.

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

видимость: скрытый; дисплей: нет;

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

Итак, у нас есть обходной путь, который был обнаружен разработчиками ASP.NET. Похоже, что пара ключ / значение требуется веб-формам ASP.NET для запуска события click, поэтому этот обходной путь не является чем-то новым, хотя и не моим любимым способом выполнения действий.

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