Jak zezwolić tylko na liczby w polu tekstowym w maszynce mvc4 razor


84

Mam 3 pole tekstowe, które przyjmuje wartości kod pocztowy i numer telefonu komórkowego oraz numer zamieszkania. Dostałem rozwiązanie pozwalające tylko na liczbę w polu tekstowym przy użyciu jQuery z postu Bellow.

Chciałbym, aby pole tekstowe EditFor akceptowało tylko liczby

ale czy możemy to zrobić za pomocą adnotacji danych, ponieważ używam maszynki do golenia MVC4?


1
nie możesz tego zrobić, ponieważ adnotacje danych są wywoływane podczas przesyłania formularza, a nie podczas wprowadzania danych do
pól tekstowych

chociaż to prawda, możesz użyć reguł walidacji typów danych wejściowych HTML5 (jeśli są obsługiwane przez przeglądarkę). działa w tym scenariuszu pytań.
hubson bropa

Użyj jQuery z klasą css


@KarthikChintala To jest nieprawidłowe. Adnotacje danych są również używane podczas renderowania formularza w celu określenia walidacji jQuery po stronie klienta i typów danych wejściowych dla różnych pól.
ProfK

Odpowiedzi:


102

po prostu bawiłem się z typem wejścia HTML5 = liczba. chociaż nie jest obsługiwany przez wszystkie przeglądarki, spodziewam się, że jest to sposób na obsługę specyficznego typu (np. numer). całkiem proste do zrobienia z maszynką do golenia (ex to VB)

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

i dzięki Lee Richardson, sposób C #

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

wykraczające poza zakres pytania, ale możesz zrobić to samo podejście dla dowolnego typu danych wejściowych HTML5


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

2
Możesz także wprowadzić znaki „-” i „+”, które nie są znakami, ale liczbą.
Mr. Blond

Jest to przynajmniej częściowo obsługiwane we wszystkich głównych przeglądarkach z wyjątkiem Opera Mini.
Tobias J

Oprócz znaków „-” i „+” można wprowadzić znak „e”. Użyłem adnotacji danych + wyrażenia regularnego, na co wskazał Donal Lafferty w swojej odpowiedzi.
alejandro zuleta

61

Użyj wyrażenia regularnego, np

[RegularExpression("([1-9][0-9]*)", ErrorMessage = "Count must be a natural number")]
public int Count { get; set; }

2
To powinna być odpowiedź.

53
@Html.TextBoxFor(m => m.PositiveNumber, 
                      new { @type = "number", @class = "span4", @min = "0" })

w MVC 5 z Razor można dodać dowolny atrybut wejściowy html w obiekcie anonimowym zgodnie z powyższym przykładem, aby zezwolić tylko na liczby dodatnie w polu wejściowym.


Całkiem zgrabne rozwiązanie do walidacji front-endu. Dzięki za zaoszczędzenie czasu @realaValoro :-)
Asif Mehmood

Skąd pochodzi klasa span4?
mischka

to tylko przykład, jak określić dowolną klasę CSS dla pola tekstowego.
diegosasw

15

w polu tekstowym napisz ten kod onkeypress="return isNumberKey(event)" i funkcję, która jest poniżej.

<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>

zdarzenie javascript nie jest zdefiniowane firefox

To nie zadziała na wielu smartfonach, ponieważ zdarzenie naciśnięcia klawisza nie jest dostępne we wszystkich telefonach komórkowych.
Repo

odpowiedziano na MVC4 razr
Shwet

9

Użyj atrybutu DataType, ale będzie to z wyjątkiem wartości ujemnych, więc poniższe wyrażenie regularne pozwoli tego uniknąć

   [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

To zadziałało dla mnie:

<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);
    }
});

To nie zadziała na wielu smartfonach, ponieważ zdarzenie naciśnięcia klawisza nie jest dostępne we wszystkich telefonach komórkowych.
Repo

5

Użyj tej funkcji w swoim skrypcie i umieść zakres w pobliżu pola tekstowego, aby wyświetlić komunikat o błędzie

$(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>

Głosowano za prostym rozwiązaniem. Nie wiem, dlaczego nie oznaczyli tego jako odpowiedź działającą jak urok
ImranNaqvi

To nie zadziała na wielu smartfonach, ponieważ zdarzenie naciśnięcia klawisza nie jest dostępne we wszystkich telefonach komórkowych.
Repo


2

Oto javascript, który pozwoli ci wprowadzić tylko liczby.

Zapisz się na onkeypresswydarzenie dla pola tekstowego.

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

Oto javascript do tego:

<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>

Mam nadzieję, że ci to pomoże.


Nie wszystkie ścieżki kodu zwracają wartość i nie działa to dla mnie

To nie zadziała na wielu smartfonach, ponieważ zdarzenie naciśnięcia klawisza nie jest dostępne we wszystkich telefonach komórkowych.
Repo

2

dla wartości dziesiętnych większych od zera HTML5 działa w następujący sposób:

<input id="txtMyDecimal" min="0" step="any" type="number">

Jak to zrobić z pomocą HTMLhelpera w maszynce do golenia?
LarryBud

Próbowałem użyć Razora, ale po wielu latach poszukiwań nie mogłem znaleźć rozwiązania, które byłoby tak czyste.
Chris J,

1

Może możesz użyć adnotacji danych [Integer] (jeśli używasz DataAnnotationsExtensions http://dataannotationsextensions.org/ ). Jednak spowoduje to tylko sprawdzenie, czy wartość jest liczbą całkowitą, a nie, jeśli jest wypełniona (może więc być potrzebny atrybut [Wymagany]).

Jeśli włączysz dyskretną weryfikację, zostanie ona zweryfikowana po stronie klienta, ale powinieneś również użyć Modelstate.Valid w akcji POST, aby odrzucić ją w przypadku, gdy ludzie mają wyłączony JavaScript.


0

DataTypema drugi konstruktor, który pobiera ciąg. Jednak wewnętrznie jest to w rzeczywistości to samo, co użycie UIHintatrybutu.

Dodanie nowego podstawowego elementu DataType nie jest możliwe, ponieważ DataTypewyliczenie jest częścią platformy .NET. Najbliższą rzeczą, jaką możesz zrobić, jest utworzenie nowej klasy, która dziedziczy po DataTypeAttribute. Następnie możesz dodać nowy konstruktor z własnym DataTypewyliczeniem.

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

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

Możesz także przejść przez ten link. Ale polecę ci użycie Jquery do tego samego.


0

Cześć, spróbuj następujących ...

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

SCENARIUSZ

<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;
   };

To nie zadziała na wielu smartfonach, ponieważ zdarzenie naciśnięcia klawisza nie jest dostępne we wszystkich telefonach komórkowych.
Repo

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>
}


-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
co powiesz na krótki opis twojego rozwiązania?
Jack Flamp,

Zwykle lepiej jest wyjaśnić rozwiązanie, zamiast po prostu publikować kilka wierszy anonimowego kodu. Możesz przeczytać Jak napisać dobrą odpowiedź , a także wyjaśnić odpowiedzi w całości oparte na kodzie
Anh Pham,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.