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.
CustomValidator es para WebForms. Está preguntando sobre DataAnnotations en MVC. –
¿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
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. –