2010-04-16 10 views
5

Estoy usando xval para usar la validación del lado del cliente en mi asp.net mvc2 web-application. A pesar de los errores que se producen cuando ingreso texto en un campo numérico, todavía intenta publicar el formulario en la base de datos. Los valores incorrectos se reemplazan por 0 y se guardan en la base de datos. Pero, en cambio, ni siquiera debería ser posible intentar enviar el formulario. ¿Puede alguien ayudarme aquí?C# mvc2 validación del formulario del lado del cliente con xval, prevenir publicación

He puesto los atributos como abajo:

[Property] 
[ShowColumnInCrud(true, label = "FromPriceInCents")] 
[Required] 
//[Range(1, Int32.MaxValue)] 
public virtual Int32 FromPriceInCents{ get; set; } 

El controlador de captura de la solicitud se ve de la siguiente manera; No recibo errores en esta parte.

[AcceptVerbs(HttpVerbs.Post)] 
[Transaction] 
[ValidateInput(false)] 
public override ActionResult Create() 
{ 
    //some foo happens 
} 

Mi vista se parece a continuación:

<div class="label"><label for="Price">FromPrice</label></div> 
<div class="field"> 
<%= Html.TextBox("FromPriceInCents")%> 
<%= Html.ValidationMessage("product.FromPriceInCents")%></div> 

Y al final de la vista tengo la siguiente regla que en el código HTML genera las reglas de validación correctas

<%= Html.ClientSideValidation<Product>("Product") %> 

espero alguien puede ayudarme con este problema, ¡gracias de antemano!

EDIT: 19 de abril de Acabo de descubrir que hay un botón normal con ser utilizado en lugar de un tipo de entrada = "Botón" ¿Podría ser este el problema?

<button class="save" type="submit" name="save"><span>Opslaan</span></button> 
+1

Por qué es su ValidationMessage ("product.FromPriceInCents"), pero el cuadro de texto utiliza "FromPriceInCents"? Esto parece sospechoso. ¿Hay alguna razón por la que no estés utilizando los ayudantes fuertemente tipados? ValidationMessageFor (x => x.FromPriceInCents) – Jab

+0

Cambié los cuadros de texto y los mensajes de validación a los helpers fuertemente tipados. ¡Pero este cambio no afecta la validación, sin embargo, buen consejo! – Rob

Respuesta

0

¿Por qué tiene el atributo Rango comentado? Con las propiedades que ha especificado, siempre que se ingrese algo en el cuadro de texto, debe pasar la validación del lado del cliente.

+0

El atributo de rango es una prueba. Pero trataré de volver a ponerlo y ver qué pasa. – Rob

+0

Bien, lo intenté, la validación del lado del cliente está dando este error; Por favor, introduzca un valor entre 1 y 2147483647. Pero en Firebug puedo ver que la página todavía está tratando de hacer una devolución de datos, pero devuelve el siguiente error; 'Referencia de objeto no establecida en una instancia de un objeto.' – Rob

+0

Trate de tener su acción Crear tomar el tipo de objeto como éste ActionResult pública Crear (ObjectType newObject) – MHinton

2

Mi primera y principal preocupación aquí sería: ¿por qué su aplicación guarda los valores en la base de datos en primer lugar? Mientras que xVal es una buena manera de hacer que la aplicación sea fácil de usar, aún TIENES que hacer la validación del lado del servidor. Si no valida sus datos en el servidor, ¡tiene un agujero de seguridad masivo! Intente comprobar si el ModelState.IsValid en su controlador antes de guardar los valores.

Ahora, por lo que veo que está registrando la validación XVal usando

<%= Html.ClientSideValidation<Product>("Product") %> 

La forma en que funciona es que permite la validación del lado del cliente para todos los controles con el prefijo "Producto". Su cuadro de texto en el otro lado tiene un id de FromPriceInCents

Así que la solución a este problema sería la de hacer esto:

<%= Html.TextBox("FromPriceInCents")%> 
<%= Html.ValidationMessage("FromPriceInCents")%> 

<%= Html.ClientSideValidation<Product>() %> 

UPD3 I actualizado el post. Se reparó el código para que no se use el prefijo.

Además, compilé una solución de trabajo que contiene una solución de trabajo. Listar, Editar, Crear página, cadenas y propiedades int, y validación xVal.

public class Product 
{ 
    [ScaffoldColumn(false)] 
    public int Id { get; set; } 

    [Required] 
    [Range(1,50)] 
    public int PriceInCents { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string Name { get; set; } 
} 

y en la vista

<%= Html.TextBoxFor(model => model.PriceInCents) %> 
<%= Html.ValidationMessageFor(model => model.PriceInCents) %> 

Aquí está el enlace de descarga ..Hay que ver y dime si funciona http://www.flexlabs.org/download/xValTest

+0

Gracias por la buena respuesta, probaré su solución y le haré saber. Tiene razón acerca de la validación del lado del servidor, de hecho todavía necesito solucionar esto. – Rob

+0

Intenté su solución agregando el prefijo al cuadro de texto. Pero luego la validación no funciona en absoluto. Cuando lo uso así; <% = Html.TextBox ("FromPriceInCents")%> <% = Html.ValidationMessage ("product.FromPriceInCents")%> <% = Html.ClientSideValidation ("producto")%> La validación me muestra errores cuando ingreso texto en un cuadro que espera números. Pero cuando trato de enviar la página, todavía estoy haciendo una devolución de datos, algo que no espero y quiero que haga. Obtuve la validación en el servidor trabajando ahora con Modelstate.IsValid – Rob

+0

Ah sí, eso es porque el método Create no pudo modificar los valores de los formularios. Actualicé la publicación con un ejemplo –

Cuestiones relacionadas