Я пишу приложение ASP.NET. У меня есть текстовое поле в веб-форме, и я хочу заставить все, что пользователь вводит, использовать верхний регистр. Я бы хотел сделать это во внешнем интерфейсе. Вы также должны отметить, что в этом текстовом поле есть элемент управления проверкой, поэтому я хочу убедиться, что решение не мешает проверке ASP.NET.
Уточнение: Похоже, что преобразование текста CSS заставляет вводимые пользователем символы отображаться в верхнем регистре. Однако под капотом это все еще нижний регистр, поскольку элемент управления проверкой не работает. Видите ли, мой контроль проверки проверяет, введен ли действительный код состояния, однако используемое мной регулярное выражение работает только с заглавными буквами.
Я не эксперт по регулярным выражениям. Я знаю способ поддерживать сравнение кода состояния в верхнем и нижнем регистре в регулярном выражении, а также дублировать каждый код состояния дважды (верхний и нижний). Я подумал, что будет чище просто преобразовать поле ввода в верхний регистр.
Не беспокойтесь - я бы рекомендовал использовать что-то вроде следующего (C#) вместо изменения пользовательского ввода: Regex re = new Regex ("myExpression", RegexOptions.IgnoreCase);
У меня такая же проблема. Я устанавливаю текстовое преобразование как верхний регистр, чтобы установить внешний вид текстового поля в соответствии с типами пользователя, и я использую событие onblur, чтобы установить значение в верхний регистр, когда текстовое поле теряет фокус. Однако валидатор недоволен значением. Вы нашли решение этой проблемы?
почему бы вместо этого не предоставить раскрывающийся список для кода состояния?
@ RandomUs1r На мой взгляд, мне никогда не нравилось использовать раскрывающийся список для выбора состояния. Намного проще набрать NY, а затем найти «Нью-Йорк» в списке выбора.
@Aheho, если вы выберете NYC, выберите раскрывающееся меню в любом современном браузере и введите NY, вы получите NYC.
Это не поможет, если вы показываете названия штатов в тексте, а «Нью-Джерси» и «Нью-Мексико» стоят перед «Нью-Йорк» в списке.
используйте Style = "text-transform: uppercase;" или CssClass = "upper"



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используйте стиль CSS в текстовом поле. Ваш CSS должен быть примерно таким:
.uppercase
{
text-transform: uppercase;
}
<asp:TextBox ID = "TextBox1" runat = "server" Text = "" CssClass = "uppercase"></asp:TextBox>;
Валидатор REGEX по-прежнему не работает с чисто CSS-решением.
Установить стиль текстового поля как текст-преобразование: прописные буквы?
Прочтите разъяснение в самом вопросе. Это изменяет только внешний вид, но не базовое значение в текстовом поле.
В JavaScript есть строковая функция toUpperCase ().
Итак, что-то в этом роде:
function makeUpperCase(this)
{
this.value = this.value.toUpperCase();
}
Это изменит его только после, нет, когда они его напечатают.
Вы можете добавить эту функцию к событию onchange текстовой области, и она будет обновлять ее на лету, хотя это будет немного медленнее. CSS - это правильный путь ИМХО.
@diodeus - если вы используете событие TextChange, то оно произойдет по мере их появления. @Tom - действительно ли CSS изменяет базовый ASCI или просто то, как он отображается?
@Stephen - Хороший вопрос! Я создал небольшую страницу, чтобы проверить это, и похоже, что CSS изменяет только то, как он выглядит нет, лежащий в основе ASCII.
@Tom - Я думал, что это должно происходить через JS, а не через CSS, чтобы валидатор сработал правильно.
style='text-transform:uppercase'
text-transform только изменяет внешний вид, он не переводит базовое значение в верхний регистр
Здесь может помочь CSS.
style = "text-transform: uppercase";"
это помогает?
text-transform только изменяет внешний вид, он не переводит базовое значение в верхний регистр
Используйте CSS с текстовым преобразованием для внешнего интерфейса, а затем используйте метод toUpper на стороне сервера перед проверкой.
Неисправный элемент управления проверкой выполняется на стороне клиента.
Я сделал что-то подобное сегодня. Вот модифицированная версия:
<asp:TextBox ID = "txtInput" runat = "server"></asp:TextBox>
<script type = "text/javascript">
function setFormat() {
var inp = document.getElementById('ctl00_MainContent_txtInput');
var x = inp.value;
inp.value = x.toUpperCase();
}
var inp = document.getElementById('ctl00_MainContent_txtInput');
inp.onblur = function(evt) {
setFormat();
};
</script>
По сути, сценарий присоединяет событие, которое запускается, когда текстовое поле теряет фокус.
Я этого не понимаю. Откуда вы взяли идентификатор ctl00_MainContent_txtInput?
ASP.NET переводит ваши идентификаторы. Вы можете выяснить их, просмотрев исходный код страницы, с которой вы работаете. ctl00 - это общий префикс (но он может быть другим), MainContent - это просто имя формы, в которую был помещен элемент управления.
Не могло ли это потенциально сломаться при переходе на более новую версию ASP.NET?
Возможно, но вы всегда можете использовать уникальное имя текстового поля и структуру JavaScript, такую как jQuery, и найти элемент управления, в котором уникальное имя соответствует шаблону. Я старался, чтобы образец кода был простым.
Есть лучший способ получить идентификатор клиента -> <% = TextBox1.ClientID%>. Это даст правильный идентификатор.
Почему бы не использовать комбинацию CSS и серверной части? Использовать:
style='text-transform:uppercase'
в TextBox и в вашем коде используйте:
Textbox.Value.ToUpper();
Вы также можете легко изменить свое регулярное выражение на валидаторе, чтобы использовать строчные и прописные буквы. Это, вероятно, более простое решение, чем принудительное использование прописных букв.
Я бы пошел с ToUpper (). Почему вы хотите вводить такие ограничения для конечного пользователя? Это не дружественный интерфейс. Возьмите все, что дает вам пользователь, и сделайте это заглавными буквами самостоятельно.
Я бы тоже это сделал. Возиться с Javascript до тех пор, пока вы не получите то, что вы хотите, - это гораздо больше работы, и вам потребуется включить Javascript, что просто не нужно с решением Роршаха.
Вы можете перехватить события нажатия клавиш, отменить события нижнего регистра и добавить их версии в верхнем регистре к вводу:
window.onload = function () {
var input = document.getElementById("test");
input.onkeypress = function () {
// So that things work both on Firefox and Internet Explorer.
var evt = arguments[0] || event;
var char = String.fromCharCode(evt.which || evt.keyCode);
// Is it a lowercase character?
if (/[a-z]/.test(char)) {
// Append its uppercase version
input.value += char.toUpperCase();
// Cancel the original event
evt.cancelBubble = true;
return false;
}
}
};
Это работает как в Firefox, так и в Internet Explorer. Вы можете увидеть это в действии здесь.
Но это не сработает, если пользователь попытается ввести текст в середине текста.
<!-- Script by hscripts.com -->
<script language=javascript>
function upper(ustr)
{
var str=ustr.value;
ustr.value=str.toUpperCase();
}
function lower(ustr)
{
var str=ustr.value;
ustr.value=str.toLowerCase();
}
</script>
<form>
Type Lower-case Letters<textarea name = "address" onkeyup = "upper(this)"></textarea>
</form>
<form>
Type Upper-case Letters<textarea name = "address" onkeyup = "lower(this)"></textarea>
</form>
Я бы сделал это с помощью jQuery.
<script src = "Scripts/jquery-1.3.2.js" type = "text/javascript"></script>
<script type = "text/javascript">
$(document).ready(function() {
$("#txt").keydown(function(e) {
if (e.keyCode >= 65 & e.keyCode <= 90) {
val1 = $("#txt").val();
$("#txt").val(val1 + String.fromCharCode(e.keyCode));
return false;
}
});
});
</script>
У вас должна быть библиотека jQuery в папке /script.
кроме случаев, когда вы печатаете в середине текста
**I would do like:
<asp:TextBox ID = "txtName" onkeyup = "this.value=this.value.toUpperCase()" runat = "server"></asp:TextBox>**
Я понимаю, что это немного поздно, но я не смог найти хорошего ответа, который работал бы с ASP.NET AJAX, поэтому я исправил код выше:
function ToUpper() {
// So that things work both on FF and IE
var evt = arguments[0] || event;
var char = String.fromCharCode(evt.which || evt.keyCode);
// Is it a lowercase character?
if (/[a-z]/.test(char)) {
// convert to uppercase version
if (evt.which) {
evt.which = char.toUpperCase().charCodeAt(0);
}
else {
evt.keyCode = char.toUpperCase().charCodeAt(0);
}
}
return true;
}
Используется так:
<asp:TextBox ID = "txtAddManager" onKeyPress = "ToUpper()" runat = "server"
Width = "84px" Font-Names = "Courier New"></asp:TextBox>
Спасибо. Я разместил этот код в stackoverflow.com/questions/8026535/…. Ошибка при использовании команды вставки (Ctrl + V или из контекстного меню). Как заставить его работать и с командой вставки?
Я провел некоторый анализ этой проблемы в четырех популярных версиях браузеров.
ответ, который я нашел, - реализовать это при нажатии клавиш вместе с тегом стиля.
<-- form name = "frmTest" -->
<-- input type = "text" size=100 class = "ucasetext" name = "textBoxUCase" id = "textBoxUCase" -->
<-- /form -->
window.onload = function() {
var input = document.frmTest.textBoxUCase;
input.onkeyup = function() {
input.value = input.value.toUpperCase();
}
};
вот решение, которое сработало для меня.
http://plugins.jquery.com/project/bestupper
Вам нужно получить JavaScript от http://plugins.jquery.com/files/jquery.bestupper.min.js.txt, и готово.
Работает как шарм!
Хорошо, после тестирования вот решение получше и чище.
$('#FirstName').bind('keyup', function () {
// Get the current value of the contents within the text box
var val = $('#FirstName').val().toUpperCase();
// Reset the current value to the Upper Case Value
$('#FirstName').val(val);
});
Проблема с этим решением возникает, если пользователь завершает ввод данных, а затем думает о редактировании. Если использование исправляет и повторно набирает символ, тогда курсор снова устанавливается в конец строки, поскольку значение для текстового поля изменяется.
<telerik:RadTextBox ID = "txtCityName" runat = "server" MaxLength = "50" Width = "200px"
Style = "text-transform: uppercase;">
Я использую простой встроенный оператор
<asp:TextBox ID = "txtLocatorName" runat = "server"
style = "text-transform:uppercase" CssClass = "textbox"
TabIndex = "1">
</asp:TextBox>
Если вы не хотите использовать классы css, вы можете просто использовать оператор встроенного стиля (этот просто явно заглавными буквами) :)
На стороне сервера использовать
string UCstring = txtName.Text.ToUpper();
Этот ответ был предоставлен, и причина, по которой его недостаточно, объясняется в вопросе.
Это отлично. Кто-то другой может извлечь из этого пользу. Хотя я не думаю, что это нужно принимать.
text-transform только изменяет внешний вид, он не переводит базовое значение в верхний регистр.
$().ready(docReady);
function docReady() {
$("#myTextbox").focusout(uCaseMe);
}
function uCaseMe() {
var val = $(this).val().toUpperCase();
// Reset the current value to the Upper Case Value
$(this).val(val);
}
Это многоразовый подход. Таким образом можно создать любое количество текстовых полей без имени. Решение для всей страницы может быть достигнуто путем изменения селектора в docReady.
В моем примере используется потерянный фокус, вопрос не указывал по мере набора. Вы можете инициировать изменение, если это важно для вашего сценария.
текстовое преобразование
CSS property specifies how to capitalize an element's text. It can be used to make text appear in all-uppercase or all-lowercase
CssClass
Свойство WebControl.CssClass
вы можете узнать о нем больше - https://developer.mozilla.org/en/docs/Web/CSS/text-transform
использоватьStyle = "text-transform: uppercase;" или CssClass = "upper"
Где? Как это помогает? Любая ссылка?
Вы, вероятно, не опубликовали бы это в качестве ответа, если бы это не сработало для вас. Однако где именно вы разместили эти атрибуты? Как вы узнали о text-transform или CssClass? Вы можете улучшить свой ответ, добавив подобную информацию.
Вы намеренно ограничиваете свое регулярное выражение только работой с прописными буквами? Судя по вашей формулировке, вы можете не знать, что реализации регулярных выражений обычно поддерживают переключатель с учетом регистра.