Recently I've been involved in a project that features a great deal of different content types. Early on I figured that using an AllowedTypesAttribute on ContentAreas would be helpful for the editors, since you might not want to drop exactly everything, everywhere.
Given the way that the AllowedTypesAttribute works, you have to specify each type that you might want inside that ContentArea, no inheritance or interfacing allowed. I came up with a fairly simple workaround for situations where you want to control the allowance on all ContentAreas that have no AllowedTypesAttribute defined in the solution. Mainly to avoid having to enter a lot of text.
Create a new interface, preferably somewhere where interfaces like to grow.
public interface IContentAreaContent : IContentData { }
In the same project as your models. Or modify the below example accordingly.
public static class ModelConfiguration { public static readonly Type[] DefaultAllowedContentTypes = Assembly.GetExecutingAssembly() .GetTypes() .Where(p => typeof(IContentAreaContent).IsAssignableFrom(p) && !p.IsInterface) .ToArray(); }
This step overrides the ContentAreaEditorDescriptor and specifies all the classes that implement IContentAreaContent for you.
[EditorDescriptorRegistration(TargetType = typeof(ContentArea), EditorDescriptorBehavior = EditorDescriptorBehavior.OverrideDefault)] public class AllowedTypeContentAreaEditorDescriptor : ContentAreaEditorDescriptor { public AllowedTypeContentAreaEditorDescriptor() { AllowedTypes = ModelConfiguration.DefaultAllowedContentTypes; } }