Cómo permitir solo números en el cuadro de texto en mvc4 razor

83

Tengo 3 cuadros de texto que toman valores de código postal y número de móvil y número residencial. Obtuve la solución para permitir solo el número en el cuadro de texto usando jquery de Bellow post.

Me gustaría hacer que un cuadro de texto EditFor acepte solo números

pero, ¿podemos hacer esto usando anotaciones de datos ya que estoy usando la maquinilla de afeitar MVC4?

vaibhav shah
fuente
1
no puede hacer esto porque las anotaciones de datos se llaman cuando envía su formulario, no cuando ingresa datos en sus cuadros de texto
Karthik Chintala
si bien eso es cierto, puede usar las reglas de validación de tipos de entrada de HTML5 (donde sea compatible con el navegador). funciona en este escenario de preguntas.
hubson bropa
Use jQuery con una clase css
Posible duplicado de Int o Number DataType para el atributo de validación
DataAnnotation
@KarthikChintala Eso es incorrecto. Las anotaciones de datos también se utilizan al renderizar el formulario, para determinar las validaciones de jQuery del lado del cliente y los tipos de entrada para varios campos.
ProfK

Respuestas:

102

Estaba jugando con HTML5 input type = number. si bien no es compatible con todos los navegadores, espero que sea el camino a seguir para manejar el manejo específico del tipo (número por ejemplo). bastante simple de hacer con maquinilla de afeitar (ex es VB)

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

y gracias a Lee Richardson, la forma c #

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

más allá del alcance de la pregunta, pero puede hacer este mismo enfoque para cualquier tipo de entrada html5

bropa hubson
fuente
9
también conocido como @ Html.TextBoxFor (i => i.Port, nuevo {@type = "number"})
Lee Richardson
2
También puede ingresar "-" y "+" que sean caracteres, no números.
Mr. Blond
Esto es al menos parcialmente compatible con todos los navegadores principales, excepto Opera Mini.
Tobias J
Además de los caracteres "-" y "+", puede introducir el carácter "e". Usé Data Annotation + regex como lo señaló Donal Lafferty en su respuesta.
Alejandro Zuleta
60

Utilice una expresión regular, p. Ej.

[RegularExpression("([1-9][0-9]*)", ErrorMessage = "Count must be a natural number")]
public int Count { get; set; }
Donal Lafferty
fuente
2
Esta debería ser la respuesta.
53
@Html.TextBoxFor(m => m.PositiveNumber, 
                      new { @type = "number", @class = "span4", @min = "0" })

en MVC 5 con Razor, puede agregar cualquier atributo de entrada html en el objeto anónimo como en el ejemplo anterior para permitir solo números positivos en el campo de entrada.

diegosasw
fuente
Solución bastante ordenada para la validación de front-end. Gracias por ahorrarme tiempo @realaValoro :-)
Asif Mehmood
¿De dónde viene la clase span4?
mischka
es solo una muestra de cómo especificar cualquier clase CSS para un cuadro de texto.
diegosasw
15

en el cuadro de texto escriba este código onkeypress="return isNumberKey(event)" y la función para esto está justo debajo.

<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
fuente
El evento javascript no está definido
Esto no funcionará en muchos teléfonos inteligentes ya que el evento de pulsación de tecla no está disponible en todos los móviles.
Repo
fue respondido por MVC4 razr
Shwet
9

Utilice el atributo DataType, pero esto excluirá los valores negativos, por lo que la expresión regular a continuación evitará esto

   [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; }
TAHA SULTAN TEMURI
fuente
8

Esto funcionó para mí:

<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);
    }
});
Deependra Singh
fuente
Esto no funcionará en muchos teléfonos inteligentes ya que el evento de pulsación de tecla no está disponible en todos los móviles.
Repo
5

Use esta función en su secuencia de comandos y coloque un intervalo cerca del cuadro de texto para mostrar el mensaje de error

$(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
fuente
votó a favor de una solución simple. No sé por qué no lo marcaron como respuesta funcionando a la
perfección
Esto no funcionará en muchos teléfonos inteligentes ya que el evento de pulsación de tecla no está disponible en todos los móviles.
Repo
3

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

No, según entiendo tu pregunta, la validación discreta solo mostrará errores. La forma más sencilla es usar el complemento jquery:

Complemento de entrada enmascarado

desarrollador web
fuente
2

Aquí está el javascript que le permitirá ingresar solo números.

Suscríbete al onkeypressevento para el cuadro de texto.

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

Aquí está el javascript para ello:

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

Espero que te ayude.

Karthik Chintala
fuente
No todas las rutas de código devuelven un valor, y no funciona para mí
Esto no funcionará en muchos teléfonos inteligentes ya que el evento de pulsación de tecla no está disponible en todos los móviles.
Repo
2

para valores decimales mayores que cero, HTML5 funciona de la siguiente manera:

<input id="txtMyDecimal" min="0" step="any" type="number">
Chris J
fuente
¿Y cómo se hace esto con HTMLhelper en razor?
LarryBud
Intenté usar Razor, pero después de buscar durante años, no pude encontrar una solución tan limpia.
Chris J
1

Tal vez puedas usar la anotación de datos [Integer] (si usas DataAnnotationsExtensions http://dataannotationsextensions.org/ ). Sin embargo, esto solo verificará si el valor es un número entero, no si está completo (por lo que es posible que también necesite el atributo [Requerido]).

Si habilita la Validación discreta, la validará en el lado del cliente, pero también debe usar Modelstate.Valid en su acción POST para rechazarla en caso de que las personas tengan Javascript deshabilitado.

Céryl Wiltink
fuente
0

DataTypetiene un segundo constructor que toma una cadena. Sin embargo, internamente, esto es lo mismo que usar el UIHintatributo.

No es posible agregar un nuevo DataType principal ya que la DataTypeenumeración es parte del marco .NET. Lo más cercano que puede hacer es crear una nueva clase que herede de DataTypeAttribute. Luego, puede agregar un nuevo constructor con su propia DataTypeenumeración.

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

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

También puede ir a través de este enlace. Pero te recomendaré que uses Jquery para lo mismo.

Bhushan Firake
fuente
0

Hola, prueba lo siguiente ...

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

GUIÓN

<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;
   };
ar.gorgin
fuente
Esto no funcionará en muchos teléfonos inteligentes ya que el evento de pulsación de tecla no está disponible en todos los móviles.
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>
}
rasika kale
fuente
0

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

Utilice el tipo = "número"

Ashandra Singh
fuente
-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;
}}
Gautam Prajapati
fuente
2
¿Qué tal una pequeña descripción de su solución?
Jack Flamp
Por lo general, es mejor explicar una solución en lugar de simplemente publicar algunas filas de código anónimo. Puede leer Cómo escribo una buena respuesta y también Explicar respuestas completamente basadas en código
Anh Pham