validar validaciones solo que numeros net mvc isvalid formulario electronico dataannotations correo asp asp.net-mvc regex razor data-annotations

asp.net-mvc - validaciones - validar formulario asp.net mvc



Validación de las validaciones de datos(Expresión regular) en asp.net mvc 4: vista de maquinilla de afeitar (8)

El validador DataAnnotations no funciona en asp.net mvc 4 razor view, cuando se usan los caracteres especiales en la expresión regular.

Modelo:

[StringLength(100)] [Display(Description = "First Name")] [RegularExpression("^([a-zA-Z0-9 .&''-]+)$", ErrorMessage = "Invalid First Name")] public string FirstName { get; set; }

Razor View:

@Html.TextBoxFor(model => Model.FirstName, new { }) @Html.ValidationMessageFor(model => Model.FirstName)

La validación discreta se presenta a la vista como:

<input type="text" value="" tabindex="1" style="height:auto;" name="FirstName" maxlength="100" id="FirstName" data-val-regex-pattern="^([a-zA-Z0-9 .&amp;amp;&amp;#39;-]+)$" data-val-regex="Invalid First Name" data-val-length-max="100" data-val-length="The field FirstName must be a string with a maximum length of 100." data-val="true" class="textfield ui-input-text ui-body-d ui-corner-all ui-shadow-inset valid">

El patrón de expresión regular en el html anterior no se representa como se especifica en RegularExpression del modelo, lo que genera un error incluso al ingresar los datos válidos ( Sam''s ).

¿Cómo puedo manejar esto?

--ACTUALIZAR--

He actualizado el código según la sugerencia de @Rick

[StringLength(100)] [Display(Description = "First Name")] [RegularExpression("([a-zA-Z0-9 .&''-]+)", ErrorMessage = "Enter only alphabets and numbers of First Name")] public string FirstName { get; set; }

Ver fuente muestra lo siguiente:

<input data-val="true" data-val-length="The field FirstName must be a string with a maximum length of 100." data-val-length-max="100" data-val-regex="Enter only alphabets and numbers of First Name" data-val-regex-pattern="([a-zA-Z0-9 .&amp;amp;&amp;#39;-]+)" id="FirstName" maxlength="100" name="FirstName" type="text" value="" />

Todavía tengo el mismo problema.


¿Qué navegador estás usando? Ingresé su ejemplo e intenté en IE8 y Chrome y valió bien cuando escribí el valor de Sam''s

public class IndexViewModel { [Required(ErrorMessage="Required")] [RegularExpression("^([a-zA-Z0-9 .&''-]+)$", ErrorMessage = "Invalid First Name")] public string Name { get; set; } }

Cuando inspecciono el DOM usando la barra de herramientas del Desarrollador de IE y el modo Desarrollador de Chrome, no muestra ningún carácter especial.


ACTUALIZACIÓN 9 de julio de 2012 - Parece que esto está arreglado en RTM.

  1. Ya implicamos ^ y $ por lo que no es necesario que los agregue. (No parece ser un problema incluirlos, pero no los necesita)
  2. Esto parece ser un error en ASP.NET MVC 4 / Vista previa / Beta. He abierto un error

Ver fuente muestra lo siguiente:

data-val-regex-pattern="([a-zA-Z0-9 .&amp;&#39;-]+)" <-- MVC 3 data-val-regex-pattern="([a-zA-Z0-9&#32;.&amp;amp;&amp;#39;-]+)" <-- MVC 4/Beta

Parece que estamos codificando dos veces.


El problema es que el patrón de expresiones regulares está siendo codificado en HTML dos veces , una vez cuando se está construyendo la expresión regular y una vez cuando se representa en su vista.

Por ahora, intente empaquetar su TextBoxFor en un Html.Raw , así:

@Html.Raw(Html.TextBoxFor(model => Model.FirstName, new { }))


Hemos tenido un problema similar en el pasado (como lo menciona TweeZz). En nuestro caso, estamos controlando la salida de TextBoxFor por nuestro método de extensión htmlHelper personalizado que está construyendo MvcHtmlString, en un solo paso debemos agregar estos atributos de validación discretos, que se realiza a través de

var attrs = htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata)

después de la llamada a este método, los atributos están codificados en html, por lo que simplemente verificamos si hay validador de expresiones regulares ahí y, si es así, descodificamos html este atributo y luego los fusionamos en tagBuilder (para construir la etiqueta de "entrada")

if(attrs.ContainsKey("data-val-regex")) attrs["data-val-regex"] = ((string)attrs["data-val-regex"]).Replace("&amp;","&"); tagBuilder.MergeAttributes(attrs);

Solo nos preocupamos por & amperios, es por eso que este reemplazo literal


Intenta escapar de esos personajes:

[RegularExpression(@"^([a-zA-Z0-9 /./&/'/-]+)$", ErrorMessage = "Invalid First Name")]


Intente usar el código ASCII para esos valores:

^([a-zA-Z0-9 ./x26/x27-]+)$

  • /x26 = &
  • /x27 = ''

El formato es /xnn donde nn es el código de carácter hexadecimal de dos dígitos. También podría usar /unnnn para especificar un código de carácter hexadecimal de cuatro dígitos para el carácter Unicode.


Prueba este en la clase de modelo

[Required(ErrorMessage = "Enter full name.")] [RegularExpression("([A-Za-z])+( [A-Za-z]+)", ErrorMessage = "Enter valid full name.")] public string FullName { get; set; }


Pruebe @ sign al comienzo de la expresión. Por lo tanto, no necesitará escribir caracteres de escape simplemente copie y pegue la expresión regular en "" y ponga @ sign. Al igual que:

[RegularExpression(@"([a-zA-Z/d]+[/w/d]*|)[a-zA-Z]+[/w/d.]*", ErrorMessage = "Invalid username")] public string Username { get; set; }