Как разрешить только числа в текстовом поле в бритве mvc4

84

У меня есть 3 текстовых поля, которые принимают значения почтовый индекс, номер мобильного телефона и номер дома. Я получил решение, позволяющее разрешить только число в текстовом поле с помощью jquery из сообщения Bellow.

Я хотел бы, чтобы текстовое поле EditFor принимало только числа

но можем ли мы сделать это с помощью аннотаций данных, поскольку я использую бритву MVC4?

Вайбхав шах
источник
1
вы не можете этого сделать, потому что аннотации данных вызываются при
отправке
хотя это правда, вы можете использовать правила проверки типов ввода HTML5 (если они поддерживаются браузером). работает в этом сценарии вопроса.
hubson bropa
Используйте jQuery с классом css
Возможный дубликат Int или Number DataType для атрибута валидации
DataAnnotation
@KarthikChintala Это неверно. Аннотации данных также используются при рендеринге формы для определения проверок jQuery на стороне клиента и типов ввода для различных полей.
ProfK

Ответы:

102

Я просто играл с HTML5 input type = number. хотя он не поддерживается всеми браузерами, я ожидаю, что это будет способ обработки обработки конкретного типа (например, номер). довольно просто сделать с бритвой (например, VB)

@Html.TextBoxFor(Function(model) model.Port, New With {.type = "number"})

и благодаря Ли Ричардсону, способ C #

@Html.TextBoxFor(i => i.Port, new { @type = "number" }) 

выходит за рамки вопроса, но вы можете сделать тот же подход для любого типа ввода html5

Hubson Bropa
источник
9
aka @ Html.TextBoxFor (i => i.Port, new {@type = "number"})
Ли Ричардсон,
2
Вы также можете ввести символы «-» и «+», а не числа.
Мистер Блонд
Это, по крайней мере, частично поддерживается во всех основных браузерах, кроме Opera Mini.
Tobias J
Помимо символов «-» и «+» вы можете ввести символ «e». Я использовал Data Annotation + regex, как указал Донал Лафферти в своем ответе.
alejandro zuleta
61

Используйте регулярное выражение, например

[RegularExpression("([1-9][0-9]*)", ErrorMessage = "Count must be a natural number")]
public int Count { get; set; }
Донал Лафферти
источник
2
Это должен быть ответ.
53
@Html.TextBoxFor(m => m.PositiveNumber, 
                      new { @type = "number", @class = "span4", @min = "0" })

в MVC 5 с Razor вы можете добавить любой атрибут ввода html в анонимный объект, как в приведенном выше примере, чтобы разрешить только положительные числа в поле ввода.

Diegosasw
источник
Довольно изящное решение для проверки переднего плана. Спасибо, что сэкономил мне время @realaValoro :-)
Асиф Мехмуд
Откуда появился span4-класс?
mischka
это просто пример того, как указать любой класс css для текстового поля.
diegosasw
15

в текстовом поле напишите этот код, onkeypress="return isNumberKey(event)" и функция для этого будет чуть ниже.

<script type="text/javascript">
function isNumberKey(evt)
{
          var charCode = (evt.which) ? evt.which : event.keyCode;
          if (charCode != 46 && charCode > 31 
            && (charCode < 48 || charCode > 57))
             return false;

          return true;
}
</script>
Shwet
источник
Событие javascript не определено firefox
Это не будет работать на многих смартфонах, поскольку событие нажатия клавиши доступно не на всех мобильных устройствах.
Репо
ответ был дан для MVC4 razr
Shwet
9

Используйте атрибут DataType, но при этом будут исключены отрицательные значения, поэтому приведенное ниже регулярное выражение позволит избежать этого.

   [DataType(DataType.PhoneNumber,ErrorMessage="Not a number")]
   [Display(Name = "Oxygen")]
   [RegularExpression( @"^\d+$")]
   [Required(ErrorMessage="{0} is required")]
   [Range(0,30,ErrorMessage="Please use values between 0 to 30")]
    public int Oxygen { get; set; }
ТАХА СУЛТАН ТЕМУРИ
источник
8

Это сработало для меня:

<input type="text" class="numericOnly" placeholder="Search" id="txtSearch">

Javacript:

//Allow users to enter numbers only
$(".numericOnly").bind('keypress', function (e) {
    if (e.keyCode == '9' || e.keyCode == '16') {
        return;
    }
    var code;
    if (e.keyCode) code = e.keyCode;
    else if (e.which) code = e.which;
    if (e.which == 46)
        return false;
    if (code == 8 || code == 46)
        return true;
    if (code < 48 || code > 57)
        return false;
});

//Disable paste
$(".numericOnly").bind("paste", function (e) {
    e.preventDefault();
});

$(".numericOnly").bind('mouseenter', function (e) {
    var val = $(this).val();
    if (val != '0') {
        val = val.replace(/[^0-9]+/g, "")
        $(this).val(val);
    }
});
Депендра Сингх
источник
Это не будет работать на многих смартфонах, поскольку событие нажатия клавиши доступно не на всех мобильных устройствах.
Репо
5

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

$(document).ready(function () {
    $(".digit").keypress(function (e) {
        if (e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57)) {
            $("#errormsg").html("Digits Only").show().fadeOut("slow");
            return false;
        }
    });
});

@Html.TextBoxFor(x => x.company.ContactNumber, new { @class = "digit" })
<span id="errormsg"></span>
avc_004
источник
проголосовали за простое решение. Я не знаю, почему они не отметили его как ответ, работающий как шарм
ImranNaqvi
Это не будет работать на многих смартфонах, поскольку событие нажатия клавиши доступно не на всех мобильных устройствах.
Репо
3

can we do this using data annotations as I am using MVC4 razor ?

Нет, насколько я понимаю ваш вопрос, ненавязчивая проверка покажет только ошибки. Самый простой способ - использовать плагин jquery:

Плагин маскированного ввода

веб-разработчик
источник
2

Вот javascript, который позволяет вводить только числа.

Подпишитесь на onkeypressсобытие для текстового поля.

@Html.TextBoxFor(m=>m.Phone,new { @onkeypress="OnlyNumeric(this);"})

Вот javascript для этого:

<script type="text/javascript">
function OnlyNumeric(e) {
            if ((e.which < 48 || e.which > 57)) {
                if (e.which == 8 || e.which == 46 || e.which == 0) {
                    return true;
                }
                else {
                    return false;
                }
            }
        }
</script>

Надеюсь, это поможет тебе.

Картик Чинтала
источник
Не все пути кода возвращают значение, и у меня это не работает
Это не будет работать на многих смартфонах, поскольку событие нажатия клавиши доступно не на всех мобильных устройствах.
Репо
2

для десятичных значений больше нуля HTML5 работает следующим образом:

<input id="txtMyDecimal" min="0" step="any" type="number">
Крис Дж
источник
И как это сделать с помощью HTMLhelper in razor?
LarryBud
Я попытался использовать Razor, но после долгих поисков не смог найти настолько чистого решения.
Chris J
1

Возможно, вы можете использовать аннотацию данных [Integer] (если вы используете DataAnnotationsExtensions http://dataannotationsextensions.org/ ). Однако это будет проверять только, является ли значение целым числом, а не заполнено (так что вам также может понадобиться атрибут [Required]).

Если вы включите ненавязчивую проверку, она будет проверяться на стороне клиента, но вы также должны использовать Modelstate.Valid в своем действии POST, чтобы отклонить его, если у людей отключен Javascript.

Серил Уилтинк
источник
0

DataTypeимеет второй конструктор, который принимает строку. Однако внутри это фактически то же самое, что и использование UIHintатрибута.

Добавление нового основного типа DataType невозможно, поскольку DataTypeперечисление является частью платформы .NET. Самое близкое, что вы можете сделать, - это создать новый класс, унаследованный от класса DataTypeAttribute. Затем вы можете добавить новый конструктор со своим собственным DataTypeперечислением.

public NewDataTypeAttribute(DataType dataType) : base(dataType)
 { }

public NewDataTypeAttribute(NewDataType newDataType) : base (newDataType.ToString();

Вы также можете перейти по этой ссылке. Но я рекомендую вам использовать JQuery для того же.

Бхушан Фираке
источник
0

Привет, попробуйте следующее ....

<div class="editor-field">
  <%: Html.TextBoxFor(m => m.UserName, new {onkeydown="return ValidateNumber(event);" })%>
  <%: Html.ValidationMessageFor(m => m.UserName) %>
</div>

СЦЕНАРИЙ

<script type="text/javascript">
   function ValidateNumber(e) {
       var evt = (e) ? e : window.event;
       var charCode = (evt.keyCode) ? evt.keyCode : evt.which;
       if (charCode > 31 && (charCode < 48 || charCode > 57)) {
           return false;
       }
       return true;
   };
ар.горжин
источник
Это не будет работать на многих смартфонах, поскольку событие нажатия клавиши доступно не на всех мобильных устройствах.
Репо
0
@Html.TextBoxFor(x => x.MobileNo, new { @class = "digit" , @maxlength = "10"})

@section Scripts 
{
    @Scripts.Render("~/bundles/jqueryui")
    @Styles.Render("~/Content/cssjqryUi")

    <script type="text/javascript">
         $(".digit").keypress(function (e) {
            if (e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57)) 
            {
                $("#errormsg").html("Digits Only").show().fadeOut("slow");
                return false;
            }
         });
    </script>
}
Расика Кале
источник
0

<input type = "number" @ bind = "Quantity" class = "txt2" />

Используйте type = "number"

Ашандра Сингх
источник
-1
function NumValidate(e) {
    var evt = (e) ? e : window.event;
    var charCode = (evt.keyCode) ? evt.keyCode : evt.which;
    if (charCode > 31 && (charCode < 48 || charCode > 57)) {
        alert('Only Number ');
        return false;
    }    return true;
}  function NumValidateWithDecimal(e) {

var evt = (e) ? e : window.event;
var charCode = (evt.keyCode) ? evt.keyCode : evt.which;

if (!(charCode == 8 || charCode == 46 || charCode == 110 || charCode == 13 || charCode == 9) && (charCode < 48 || charCode > 57)) {
    alert('Only Number With desimal e.g.: 0.0');
    return false;
}
else {
    return true;
} } function onlyAlphabets(e) {
try {
    if (window.event) {
        var charCode = window.event.keyCode;
    }
    else if (e) {
        var charCode = e.which;
    }
    else { return true; }

    if ((charCode > 64 && charCode < 91) || (charCode > 96 && charCode < 123) || (charCode == 46) || (charCode == 32))
        return true;
    else
        alert("Only text And White Space And . Allow");
    return false;

}
catch (err) {
    alert(err.Description);
}} function checkAlphaNumeric(e) {

if (window.event) {
    var charCode = window.event.keyCode;
}
else if (e) {
    var charCode = e.which;
}
else { return true; }

if ((charCode >= 48 && charCode <= 57) || (charCode >= 65 && charCode <= 90) || (charCode == 32) || (charCode >= 97 && charCode <= 122)) {
    return true;
} else {
    alert('Only Text And Number');
    return false;
}}
Гаутам Праджапати
источник
2
как насчет небольшого описания вашего решения?
Джек Флэмп
Обычно лучше объяснить решение, чем просто опубликовать несколько строк анонимного кода. Вы можете прочитать « Как мне написать хороший ответ» , а также « Объяснение полностью основанных на коде ответов»
Ань Фам,