C# Asp.Net MVC数据批注自定义属性不起作用

C# Asp.Net MVC数据批注自定义属性不起作用,c#,asp.net-mvc,validation,asp.net-mvc-3,data-annotations,C#,Asp.net Mvc,Validation,Asp.net Mvc 3,Data Annotations,我需要实现一个cusotm属性,然后使用asp.net数据注释来验证一个类。不幸的是,在运行时没有调用属性类。请帮帮我。非常感谢。下面是源代码 using System; using System.Collections.Generic; using CaseMgr.Model.Base; using System.Linq; using System.ComponentModel.DataAnnotations; namespace CaseMgr.Model.BusinessObject

我需要实现一个cusotm属性,然后使用asp.net数据注释来验证一个类。不幸的是,在运行时没有调用属性类。请帮帮我。非常感谢。下面是源代码

using System;
using System.Collections.Generic;
using CaseMgr.Model.Base;

using System.Linq;
using System.ComponentModel.DataAnnotations;

namespace CaseMgr.Model.BusinessObjects
{
    public partial class PatLiverException : BusinessBase<decimal>, IComparable<PatLiverException>, IEquatable<PatLiverException>
    {
        private LiverExcepDisease _liverExcepDisease = null;
        private DateTime _sccApprovalDate = new DateTime();

        public PatLiverException() { }

        public virtual LiverExcepDisease LiverExcepDisease
        {
            get { return _liverExcepDisease; }
            set { _liverExcepDisease = value; }
        }

        [SccApprovalDateValidate("SccApprovalDate", "LiverExcepDisease")]
        public virtual DateTime SccApprovalDate
        {
            get { return _sccApprovalDate; }
            set { _sccApprovalDate = value; }
        }
    }

    public class SccApprovalDateValidateAttribute : ValidationAttribute
    {
        public string m_SccApprovalDate { get; private set; }
        public string m_LiverExcepDisease { get; private set; }

        public SccApprovalDateValidateAttribute(string SccApprovalDate_PropertyName, string LiverExcepDisease_PropertyName)
        {
            this.m_SccApprovalDate = SccApprovalDate_PropertyName;
            this.m_LiverExcepDisease = LiverExcepDisease_PropertyName;
        }

        protected override ValidationResult IsValid(object value, ValidationContext context)
        {
            var SccApprovalDate_Property = context.ObjectType.GetProperty(m_SccApprovalDate);
            DateTime SccApprovalDate_Value = (DateTime)SccApprovalDate_Property.GetValue(context.ObjectInstance, null);

            var LiverExcepDisease_Property = context.ObjectType.GetProperty(m_LiverExcepDisease);
            LiverExcepDisease LiverExcepDisease_Value = (LiverExcepDisease)LiverExcepDisease_Property.GetValue(context.ObjectInstance, null);

            if (SccApprovalDate_Value != null && SccApprovalDate_Value != DateTime.MinValue && SccApprovalDate_Value != DateTime.MaxValue)
            {
                return LiverExcepDisease_Value.Id == 10 ? ValidationResult.Success : new ValidationResult("When other, SccApprovalDate can not be null.");
            }
            else
            {
                return ValidationResult.Success;
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用CaseMgr.Model.Base;
使用System.Linq;
使用System.ComponentModel.DataAnnotations;
命名空间CaseMgr.Model.BusinessObjects
{
公共部分类PatLiverException:BusinessBase、IComparable、IEquatable
{
private LiverExcepDisease _LiverExcepDisease=null;
私有日期时间_sccApprovalDate=new DateTime();
公共PatLiverException(){}
公共虚拟肝病数据库
{
获取{return\u liverexcepdise;}
设置{u liverExcepDisease=value;}
}
[SccApprovalDateValidate(“SccApprovalDate”、“LiverExcepDisease”)]
公共虚拟日期时间SccApprovalDate
{
获取{return\u sccApprovalDate;}
设置{u sccApprovalDate=value;}
}
}
公共类SccApprovalDateValidateAttribute:ValidationAttribute
{
公共字符串m_SccApprovalDate{get;private set;}
公共字符串m_LiverExcepDisease{get;private set;}
公共SCCAPproValidateValidateAttribute(字符串SCCAPproValidate_PropertyName,字符串LiverExcepdISE_PropertyName)
{
this.m_SccApprovalDate=SccApprovalDate_PropertyName;
this.m_liverexcepdise=liverexcepdise_PropertyName;
}
受保护的覆盖ValidationResult有效(对象值、ValidationContext上下文)
{
var SccApprovalDate_Property=context.ObjectType.GetProperty(m_SccApprovalDate);
DateTime SccApprovalDate_值=(DateTime)SccApprovalDate_属性.GetValue(context.ObjectInstance,null);
var liverexcepdise_Property=context.ObjectType.GetProperty(m_liverexcepdise);
LiverExcepDisease LiverExcepDisease_值=(LiverExcepDisease)LiverExcepDisease_属性.GetValue(context.ObjectInstance,null);
if(SccApprovalDate\u值!=null&&SccApprovalDate\u值!=DateTime.MinValue&&SccApprovalDate\u值!=DateTime.MaxValue)
{
return LiverExcepDisease_Value.Id==10?ValidationResult.Success:new ValidationResult(“其他时,SccApprovalDate不能为null”);
}
其他的
{
返回ValidationResult.Success;
}
}
}
}

如果要在需要的类上使用验证属性:

[AttributeUsage(AttributeTargets.Class)]
public class Sccxxxxxxxxx : ValidationAttribute
看看这篇文章:


另外,如果您在SCCAPproValidateValidateAttribute.ValidationResult()中放置断点,它会被命中吗?

您的代码看起来不错,只是我看不到您在哪里调用或使用属性SccApprovalDate,因为只有在运行时调用或使用该属性时,才会调用在该属性上声明的验证属性。您可以发布如何使用属性SccApprovalDate吗?

将代码发布为文本,而不是图像。我们不使用图像编程。嗨,梅森,我现在只是将代码重新发布为文本。请检查一下。tks.不相关,但完全没有必要添加参数
string SccApprovalDate\u PropertyName
,因为它是您应用它的属性(
IsValid()
方法中的
object value
参数是您属性的值。我尝试过“[AttributeUsage(AttributeTargets.Class)]”之前。仍然不起作用。所以我将其移动到属性级别。我在属性实现代码中放置了一个断点,我从未被击中。不知道为什么。