2013-07-04 3 views
1

ImageUrl 속성과 Description 속성으로 ImageBlock을 만들었습니다. ImageUrl은 필수 항목입니다.EPiserver 7 필수 블록 내의 속성이 필요합니다.

[ContentType(
    DisplayName = "Image", 
    Description = "Image with description and caption", 
    GUID = "387A029C-F193-403C-89C9-375A2A6BF028", 
    AvailableInEditMode = false)] 
public class ImageBlock : BaseBlock 
{ 
    [Required] 
    [UIHint(UIHint.Image)]  
    [Display(
     Name = "Image Url", 
     Description = "", 
     GroupName = SystemTabNames.Content, 
     Order = 10)]  
    public virtual Url ImageUrl { get; set; } 

    [Display(
     Name = "Image Description", 
     Description = "A description of the image", 
     GroupName = SystemTabNames.Content, 
     Order = 20)]  
    public virtual string Description { get; set; } 

} 

내 ArticlePage는 Image 속성에 대해이 ImageBlock을 사용하지만 문서에 이미지가 있어야 할 필요는 없습니다. 그러나 편집자가 이미지를 선택하면 URL이 필요합니다.

[Display(
    Name = "Image", 
    Description = "", 
    GroupName = SystemTabNames.Content, 
    Order = 20)] 
public virtual ImageBlock Image { get; set; } 

그러나 ArticlePage의 새 인스턴스를 만들 때 EPiServer 소유권 주장이 필요한 ImageUrl을 묻는 메시지가 표시됩니다. 내가 놓친 게 있니?

답변

2

필요한 블록 속성 이외의 다른 값이 설정되어 있으면 검사에서 오류가 발생하는 맞춤 속성을 만드는 방법을 발견했습니다. 예를 들어 편집기가 Image Description에 대한 값을 입력하고 ImageUrl을 지정하지 않고 게시하려고하면 오류 메시지가 표시됩니다.

코드는 다음과 같습니다

public class RequiredBlockPropertyAttribute : ValidationAttribute 
{ 
    private string _failedOnProperty = string.Empty; 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     return ValidateBlock(value, validationContext) 
      ? ValidationResult.Success 
      : new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); 
    } 

    private bool ValidateBlock(object value, ValidationContext validationContext) 
    { 
     var type = validationContext.ObjectType.BaseType; 
     if (type == null) 
      return true; 

     var properties = type.GetProperties().Where(prop => 
      prop.DeclaringType != null 
      && prop.DeclaringType.IsSubclassOf(typeof(BlockData))); 

     foreach (var property in properties) 
     { 
      if (!property.Name.Equals(validationContext.DisplayName)) 
      { 
       var val = property.GetValue(validationContext.ObjectInstance, null); 
       if (val != null && (value == null || IsDateTimeMinValue(value))) 
       { 
        _failedOnProperty = property.Name; 
        return false; 
       } 
      } 
     } 

     return true; 
    } 

    private static bool IsDateTimeMinValue(object value) 
    { 
     DateTime t; 
     DateTime.TryParse(value.ToString(), out t); 

     return t == DateTime.MinValue; 

    } 

    public override string FormatErrorMessage(string name) 
    { 
     return string.Format(ErrorMessageString, name, _failedOnProperty); 
    } 

그리고 블록의 사용 :

[RequiredBlockProperty(
     ErrorMessage = "{1} cannot be set without {0} defined")] 
    [UIHint(UIHint.Image)]  
    [Display(
     Name = "Image Url", 
     Description = "", 
     GroupName = SystemTabNames.Content, 
     Order = 10)]  
    public virtual Url ImageUrl { get; set; } 
관련 문제