2011-03-21 11 views

Respuesta

0

Puede escribir un validador personalizado para este trabajo.

Avíseme si necesita ayuda para hacerlo.

+0

CustomValidator es para WebForms. Está preguntando sobre DataAnnotations en MVC. –

+1

¿Qué? ¡¿No sabes que puedes escribir tu validador personalizado y usarlo en MVC ?! ¡Mire esta presentación de BradWilson y aprenda! http://bradwilson.typepad.com/blog/2011/02/advanced-aspnet-mvc-3-presentation.html – Zote

+2

Estoy diciendo 'CustomValidator' http://msdn.microsoft.com/en-us/ library/system.web.ui.webcontrols.customvalidator.aspx es diferente de las reglas que agrega al complemento de validación jQuery. Al agregar un proveedor de validación, como en mi respuesta, está especificando las reglas que se agregan. Estos son analizados por jQuery en DOM listo. Agregar un único script de validación no es tan flexible o reutilizable como permitir que el marco de DataAnnotaciones genere estas reglas para usted. –

4

Hay dos partes en esto. En primer lugar, debe escribir un atributo obligatorio que solo se requiere si la otra propiedad cumple con sus criterios.

Habría que hacer algo como:

public class RequiredComparerAttribute : RequiredAttribute 
{ 
    public OtherProperty { get; set; } 
    public override bool IsValid(object value) 
    { 
     // TODO: use reflection to validate other property as PropertyInfo 
     // or validate it's value after it is decided to be valid 

     foreach (ValidationAttribute va in property 
      .GetCustomAttributes(typeof(ValidationAttribute), true) 
      .OfType<ValidationAttribute>()) 
     { 
      if (!va.IsValid(value)) 
      { 
       return false; // not required 
      } 
     } 
     return true; // required 
    } 
} 

Luego, en Application_Start en el Global.asax, que tendrá que registrar el validador, que sólo se puede volver a utilizar el validador de RequiredAttribute:

 DataAnnotationsModelValidatorProvider 
      .RegisterAdapter(typeof(RequiredComparerAttribute), 
       typeof(RequiredAttributeAdapter)); 

Si desea agregar su propio validador, tendrá que escribir un validador personalizado. Phil Haack tiene un ejemplo en su blog: http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

Editar: Eche un vistazo a CompareAttribute en .NET Reflector para obtener una idea de cómo obtener el valor de OtherProperty. CompareAttribute también implementa IClientValidatable para proporcionar las reglas de validación necesarias en el lado del cliente.

I no creo que CompareAttribute funcionará para usted porque tiene que validar que se requiere un valor basado en el contenido de otra propiedad, no comparar la igualdad de dos propiedades.

Edit2: ¿Qué hace el proveedor de Validación?

Agrega reglas al formulario y proporciona mensajes para esas reglas. Puede ver exactamente cómo lo hace el RequiredAttributeAdapter al descargar la fuente MVC 3. Para entender lo que lo hace en el lado del cliente, se puede abrir la página MVC 3 en Google Chrome, pulse CTRL + SHIFT + J para abrir una ventana de herramientas de desarrollo y escriba:

$('form:first').data().unobtrusiveValidation.options 

Las normas objeto Opciones especifica en el interior cómo validar cada elemento y el objeto de mensaje especifica el mensaje de error que se mostrará para cada error de validación.

Edit3: Ejemplo completo

Dado que responder a esta pregunta, he escrito un post con un ejemplo completo de crear un atributo personalizado en el cliente (validación discreta) y el servidor. La entrada del blog es here. Este ejemplo es para un atributo 'contiene', pero debería ser bastante fácil de modificar para convertirse en una comparación requerida.

+0

Gracias, pero creo que un validador personalizado es la mejor manera. :) – Cesar

+0

@Cesar: heredar de CustomValidationAttribute es probablemente el camino a seguir, así que no tienes que hacer la reflexión, pero esta publicación te dice exactamente cómo implementar un "validador personalizado" del lado del servidor y del lado del cliente. Si se refiere a una regla de validación en el lado del cliente, aquí hay una buena explicación de los siguientes: http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html –

+0

Escribí una publicación de blog sobre cómo para crear un atributo personalizado de DataAnnotaciones para la validación tanto en el cliente como en el servidor. [Léelo aquí] (http://www.ipreferjim.com/2011/08/dataannotations-mvc3-unobtrusive-validations/) y [código fuente aquí] (https://github.com/jimschubert/ContainsAttributeExample) –

7

Usted podría utilizar MVC FoolProof marco de validación

Tiene como característica útil

[RequiredIf] 
[RequiredIfNot] 
[RequiredIfTrue] 
[RequiredIfFalse] 
[RequiredIfEmpty] 
[RequiredIfNotEmpty] 
[RequiredIfRegExMatch] 
[RequiredIfNotRegExMatch] 

[Is] 
[EqualTo] 
[NotEqualTo] 
[GreaterThan] 
[LessThan] 
[GreaterThanOrEqualTo] 
[LessThanOrEqualTo] 

la esperanza que esto ayudaría a usted!

Cuestiones relacionadas