4

ContentArea に挿入するブロックの種類を制限する際に問題が発生しています。私が欲しいのは、SliderBlock の ContentArea プロパティが SlideItemBlock の挿入のみを持つことができるということです。

[ContentType(...)]
public class SlideItemBlock : BlockData
{
    [Required]
    Display(Name = "Image")]
    public virtual string Image { get; set;}
}

[ContentType(...)]
public class SliderBlock : BlockData
{
    [Required]
    [Display(Name = "Slides")]
    public virtual ContentArea Slides { get; set; }
    //Should only accept insertion of SlideItemBlock
}

または、これは、エディターが間違ったブロック タイプをドラッグ アンド ドロップしないように制限しようとしているものを達成するための間違った方法ですか?

今のところ、SliderBlock を作成し、SlideItemBlocks を挿入できます。次に、作成した SliderBlock を新しい SliderBlock に挿入すると、永遠にループし、サイトが壊れます。これが私がコントロールしようとしているものです。

4

5 に答える 5

5

EPiServer 7.5 を使用している場合、コンテンツ領域で使用できるブロックを制限する機能が組み込まれています

ブログ投稿のコード例:

  [EditorDescriptorRegistration(TargetType = typeof(ContentArea), UIHint = "Gallery")]
  public class ImageGalleryEditorDescriptor : EditorDescriptor
  {    
     public ImageGalleryEditorDescriptor()    
     {    
        // Setup the types that are allowed to be dragged and dropped into the content        
        // area; in this case only images are allowed to be added.        
        AllowedTypes = new Type[] { typeof(IContentImage) };         

        // Unfortunetly the ContentAreaEditorDescriptor is located in the CMS module        
        // and thus can not be inherited from; these settings are copied from that        
        // descriptor. These settings determine which editor and overlay should be        
        // used by this property in edit mode.        
        ClientEditingClass = "epi-cms.contentediting.editors.ContentAreaEditor";        
        OverlayConfiguration.Add("customType", "epi-cms.widget.overlay.ContentArea");    
    }
  }
于 2013-12-04T20:13:48.177 に答える
4

EpiServer 8 の時点で、[AllowedTypes] という新しい属性があります。これは現在、ブロックを制限する最良の方法です。[AvailableContentTypes] の多くの制限を克服します。ブロックをコンテンツ領域にドラッグすると、検証が実際に機能します。

コード スニペットの例は次のようになります。

[AllowedTypes(new []{ typeof(SlideBlock) })]
public virtual ContentArea Slides { get; set; }

ここに良いコード例がありますコンテンツエリアエピサーバー内で許可されたブロックを制限する方法

これも EpiWorld http://world.episerver.com/blogs/Ben-McKernan/Dates/2015/2/the-new-and-improved-allowed-types/にあります

于 2015-08-06T21:35:50.620 に答える
0

検証クラスを作成し、EPiServer.validation から IValidate インターフェイスを実装します。これの検証は、PageData および BlockData クラスの外部で行われます。

これはあなたが探しているものでなければなりません

using System.Collections.Generic;
using System.Linq;
using EPiServer.Validation;

public class SliderBlockValidator : IValidate<SliderBlock>
{
    public IEnumerable<ValidationError> Validate(SliderBlock instance)
    {
        var errors = new List<ValidationError>();
        if (instance.Slides != null &&
            instance.Slides.Contents.Any(x => x.GetType().BaseType != typeof (SlideItemBlock)))
        {
            errors.Add(new ValidationError()
                {
                    ErrorMessage = "Only SlideItemBlocks are allowed in this area",
                    PropertyName = "Slides",
                    Severity = ValidationErrorSeverity.Error,
                    ValidationType = ValidationErrorType.StorageValidation
                });
        }

        return errors;
    }
}

http://sdkbeta.episerver.com/SDK-html-Container/?path=/SdkDocuments/CMS/7/Knowledge%20Base/Developer%20Guide/Validation/Validation.htm&vppRoot=/SdkDocuments//CMS/7でさらに読む/知識%20Base/開発者%20ガイド/

EPi 7.5 にアップグレードした場合は、AllowedTypes アノテーションを使用できます

[AllowedTypes(new [] {typeof(SlideItemBlock)})]
public virtual ContentArea Slides { get; set; }

後の解決策を使用してメッセージをカスタマイズできるかどうかはわかりません。いくつかの既知の制限があります

  • ページ上で編集する場合、オーバーレイに対して制限が機能しません。これは修正済みのバグであり、数週間以内にパッチでリリースされる予定です。
  • サーバー検証なし。現在、この属性は UI に制限を追加するだけです。サーバー検証のサポートをすぐに追加して、カスタム プロパティを検証できるようにしたいと考えています。
  • コンテンツ領域でローカル ブロックを作成するときの検証はありません。新しい機能を使用してローカル ブロックをコンテンツ領域に追加する場合、現在、新しいブロックを作成するときにコンテンツ タイプのフィルタリングは行われません。

詳細については、http://world.episerver.com/Blogs/Linus-Ekstrom/Dates/2013/12/Restriction-of-content-types-in-properties/をご覧ください。

全体として、現在のところ、最初のソリューションの方が優れています。

于 2014-01-09T12:12:12.747 に答える
-1

コンテンツ領域のプロパティに検証属性を追加して、許可されるブロック タイプを制限できます。詳細な例については、このリンクを参照してください。

次に、AvailableContentTypes 属性を使用して、SlideItemBlock タイプのみを許可するように制限できます。

    [Required]
    [Display(Name = "Slides")]
    [AvailableContentTypes(Include = new []{typeof(SlideItemBlock)})]
    public virtual ContentArea Slides { get; set; }
于 2013-11-27T23:21:38.847 に答える