2015-11-20 3 views
0

Мне нужно реализовать атрибут cusotm, а затем использовать аннотацию данных asp.net для проверки класса. К сожалению, класс атрибута не вызывается во время выполнения. Пожалуйста, помогите мне. Большое спасибо. Ниже приведен исходный код.Пользовательский атрибут аннотации данных ASP.Net MVC не работает

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; 
      } 
     } 
    } 
} 
+2

Почтовый код как текст, а не как изображение. Мы не программируем изображения. – mason

+0

Привет, каменщик, я просто переписываю код как текст. пожалуйста, проверь это. ТКС. –

+0

Не связано, но совершенно необязательно добавлять параметр 'string SccApprovalDate_PropertyName', потому что его свойство, которым вы его применяете (параметр' object value' в методе 'IsValid()' является значением вашего свойства. –

ответ

0

Если вы собираетесь использовать атрибут проверки на классе вам нужно:

[AttributeUsage(AttributeTargets.Class)] 
public class Sccxxxxxxxxx : ValidationAttribute 

https://msdn.microsoft.com/en-us/library/tw5zxet9.aspx?f=255&MSPPError=-2147217396

+0

Я пробовал «[AttributeUsage (AttributeTargets.Class)]« раньше. Все еще не работает, поэтому я перехожу на уровень свойств. –

0

Взгляните на этот пост: ASP.NET MVC: Custom Validation by DataAnnotation

Кроме того, если вы поставить точку останова внутри SccApprovalDateValidateAttribute.ValidationResult() это попало?

+0

Я поставил точку останова внутри кода реализации атрибута, я никогда не ударяю. Не знаю, почему. –

0

Ваш код выглядит нормально, за исключением того, что я не вижу, где вы вызываете или используете свойство SccApprovalDate, потому что ваш атрибут проверки, объявленный в свойстве, будет вызываться только в том случае, если свойство вызывается или используется во время выполнения. Можете ли вы опубликовать, как вы используете свойство SccApprovalDate?