2013-07-04 5 views
1

Я создал ImageBlock с свойством ImageUrl и свойством Description. Требуется 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; } 

} 

My ArticlePage использует этот ImageBlock для своего свойства Image, но не обязательно иметь изображение в статье. Однако, если редактор выбирает изображение, необходимо указать URL-адрес.

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

Но когда я создаю новый экземпляр ArticlePage я запрошу ImageUrl который EPiServer утверждает, требуется. Я что-то упускаю?

ответ

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; } 
Смежные вопросы