无法在MVC3中进行自定义验证

时间:2012-01-26 23:36:44

标签: c# asp.net-mvc-3

所以我有一个名为Proyecto的模型,由数据库第一方法创建。要为模型添加注释,我创建了一个新的类类型partial,我在其中设置了注释,但它不仅仅适用于custom one。以下是我试图实现这一目标的方法:

第一个

在这个中我将接口设置为类

[MetadataType(typeof(Proyecto.MetaData))]
public partial class Proyecto : IValidatableObject
{
    private class MetaData 
    {
        [Display(Name = "Fecha de Solicitud")]
        [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
        public Nullable<System.DateTime> FechaSolicitud { get; set; }

        [Required(ErrorMessage="Debe ingresar a un encargado de la información para el proyecto")]
        [Display(Name="Responsable de la Informacion")]
        public string ResponsableInformacion { get; set; }

        [Display(Name="Cliente Nuevo")]
        public Nullable<bool> ClienteNuevo { get; set; }

        [Required(ErrorMessage="Debe colocar una explicación que describa la aplicacion a desarrollar")]
        public string Descripcion { get; set; }

        [Required(ErrorMessage="Debe Seleccionar un tipo de requerimiento")]
        public Nullable<byte> IdTipoRequerimiento { get; set; }

        [Display(Name="Nombre del Cliente")]
        public string NombreCliente { get; set; }

    }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if ((ClienteNuevo == true) && (NombreCliente == String.Empty))
        {
            yield return new ValidationResult("Debe Colocar un nombre al Cliente");
        }
    }

}

第二个 我试图在元数据类

中实现接口
[MetadataType(typeof(Proyecto.MetaData))]
public partial class Proyecto 
{
    private class MetaData : IValidatableObject
    {
        [Display(Name = "Fecha de Solicitud")]
        [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
        public Nullable<System.DateTime> FechaSolicitud { get; set; }

        [Required(ErrorMessage="Debe ingresar a un encargado de la información para el proyecto")]
        [Display(Name="Responsable de la Informacion")]
        public string ResponsableInformacion { get; set; }

        [Display(Name="Cliente Nuevo")]
        public Nullable<bool> ClienteNuevo { get; set; }

        [Required(ErrorMessage="Debe colocar una explicación que describa la aplicacion a desarrollar")]
        public string Descripcion { get; set; }

        [Required(ErrorMessage="Debe Seleccionar un tipo de requerimiento")]
        public Nullable<byte> IdTipoRequerimiento { get; set; }

        [Display(Name="Nombre del Cliente")]
        public string NombreCliente { get; set; }


        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            if ((ClienteNuevo == true) && (NombreCliente == String.Empty))
            {
                yield return new ValidationResult("Debe Colocar un nombre al Cliente");
            }
         }

    }
}

我做错了什么???

更新

我尝试将元数据类的访问修饰符修改为public,并且仅使用类的名称但仍无效...

1 个答案:

答案 0 :(得分:0)

我有这个用于我的MVC3项目,它确实很好。

    [PropertiesMustMatch("NewPassword", "ConfirmPassword", ErrorMessage = "The new password and confirmation password do not match.")]
    [Authorize(Roles = "Administrators")]
    public class ChangePasswordModel
    {
        [Required]
        [DataType(DataType.Password)]
        [DisplayName("Current password")]
        public string OldPassword { get; set; }

        [Required]
        [ValidatePasswordLength]
        [DataType(DataType.Password)]
        [DisplayName("New password")]
        public string NewPassword { get; set; }

        [Required]
        [DataType(DataType.Password)]
        [DisplayName("Confirm new password")]
        public string ConfirmPassword { get; set; }
    }

您可以尝试替换此代码

[MetadataType(typeof(Proyecto.MetaData))]
public partial class Proyecto 
{
    private class MetaData : IValidatableObject
    {

到另一个

[MetadataType(typeof(ProyectoMetaData))]
public partial class Proyecto 
{
    class ProyectoMetaData
    {