






































































Study with the several resources on Docsity
Earn points by helping other students or get them with a premium plan
Prepare for your exams
Study with the several resources on Docsity
Earn points to download
Earn points by helping other students or get them with a premium plan
A specialized exam focused on Optimizely Content Cloud (formerly Episerver CMS). Topics include content modeling, block and page development, template creation, routing, personalization rules, editorial workflows, search optimization (Find), and extension via custom APIs. Developers are assessed on MVC architecture, dependency injection, caching strategies, and deployment pipelines. Real-world scenarios require implementing multi-site configurations, content delivery APIs, and cloud-based hosting solutions (DXP).
Typology: Exams
1 / 78
This page cannot be seen from the preview
Don't miss anything!







































































Question 1.Which attribute is used to mark a class as a page type in Optimizely Content Cloud? A) [Page] B) [ContentType] C) [PageType] D) [SiteContent] Answer: B Explanation: The [ContentType] attribute designates a class as a page type, allowing you to set GUID, name, group, and order. Question 2.What property of the [ContentType] attribute uniquely identifies a page type across environments? A) Name B) GroupName C) GUID D) Order Answer: C Explanation: The GUID is a globally unique identifier that remains constant across development, staging, and production. Question 3.How can you configure a custom route for a page type? A) By overriding the Render method in the page model B) By adding a RoutePrefix attribute to the controller C) By implementing IContentRouteHelper on the page class D) By using the [PageRoute] attribute on the page type class Answer: B Explanation: Adding [RoutePrefix] (or conventional MVC routing) on the controller lets you define a custom URL pattern for that page type. Question 4.What is the primary purpose of a Block Type in Optimizely? A) To define a page’s metadata B) To store reusable content components that can be placed in Content Areas C) To manage user authentication D) To configure site-wide settings
Answer: B Explanation: Block Types represent reusable pieces of content (e.g., teaser, hero) that editors can drag into Content Areas. Question 5.What attribute distinguishes a global block from a local block? A) [Global] on the block class B) Setting IsGlobal = true in the [ContentType] attribute C) Adding the block to the GlobalBlock folder in the CMS D) There is no attribute; global blocks are defined by placement in the “Global Blocks” library Answer: D Explanation: Global blocks are managed via the CMS UI under the “Global Blocks” library; they are not distinguished by a class attribute. Question 6.Which base class should a custom image type inherit from? A) MediaData B) ImageData C) ContentData D) AssetData Answer: B Explanation: ImageData provides image-specific properties (URL, width, height) and is the correct base for custom image types. Question 7.What is the recommended way to share common SEO fields across multiple page types? A) Duplicate the properties in each page class B) Create an abstract base class with SEO properties and inherit it C) Use a static helper class that writes to a database table D) Implement a custom interface and add the fields via composition Answer: B Explanation: An abstract base class allows you to define SEO fields once and reuse them through inheritance, keeping the model DRY.
C) It generates a GUID that is mapped to the content’s ID in each environment D) It creates a hash of the page’s content for versioning Answer: C Explanation: PermanentLinks are GUIDs that remain constant, allowing you to reference the same content item even when the numeric IDs differ between environments. Question 12.What method of IContentRepository retrieves a page’s direct children? A) GetDescendants B) GetChildren C) GetSiblings D) GetRelated Answer: B Explanation: GetChildren returns the immediate child items of a given content reference. Question 13.How can you retrieve the published version of a page when you have a draft reference? A) Call Get with the published: true flag B) Use GetVersion and pass the version number C) Use Get(reference, loaderOptions: new LoaderOptions { Publish = true }) D) Call Get(reference, new LoaderOptions { ResolvePublished = true }) Answer: D Explanation: Passing ResolvePublished = true in LoaderOptions forces the repository to return the published version if it exists. Question 14.What interface should a content model implement to provide custom server-side validation? A) IValidate B) IContentValidator C) IDataErrorInfo D) IValidatableObject
Answer: A Explanation: IValidate defines a Validate method that Optimizely calls during content save operations. Question 15.Which attribute lets you specify a custom editor UI for a property? A) [Editor] B) [UIHint] C) [DisplayEditor] D) [CustomEditor] Answer: B Explanation: [UIHint] points to a named editor template that the CMS will use for that property. Question 16.How do you render a ContentArea in a Razor view? A) @Html.ContentArea(CurrentPage.ContentArea) B) @Html.RenderContentArea(CurrentPage.ContentArea) C) @Html.PropertyFor(x => x.CurrentPage.ContentArea) D) @Html.DisplayForModel(CurrentPage.ContentArea) Answer: C Explanation: Html.PropertyFor is the helper that renders a property, and when the property is a ContentArea, it outputs all contained blocks. Question 17.What class should a block controller inherit from to receive the block model automatically? A) BlockController B) PageController C) ControllerBase D) ContentController Answer: A Explanation: BlockController is the generic base that injects the block type into the action methods. Question 18.How can you change the view that a block type uses for rendering? A) Set the ViewName property in the block model
Explanation: GetContentByUrl (exposed through IContentRouteHelper) resolves the incoming URL to the appropriate content reference. Question 22.How can you ensure that a language segment is included in generated URLs for a multilingual site? A) Set IncludeLanguageSegment = true in the site settings B) Use the [LocalizedUrl] attribute on page types C) Configure the UrlSegment property on each page per language D) Optimizely includes the segment automatically when the site has more than one language branch Answer: A Explanation: The site setting “Include language segment in URL” toggles whether /en/, /fr/, etc., are prefixed to generated URLs. Question 23.What repository provides access to language branches? A) IContentRepository B) ILanguageBranchRepository C) ILocalizationRepository D) ICultureRepository Answer: B Explanation: ILanguageBranchRepository lets you query, create, and manage language branches. Question 24.How does Optimizely handle fallback when a culture-specific property is empty? A) It throws an exception B) It displays a placeholder string “(empty)” C) It falls back to the default language’s value if fallback is enabled D) It removes the property from the rendered markup Answer: C Explanation: When fallback is enabled, Optimizely reads the value from the default language if the current language’s value is null or empty. Question 25.What attribute is used to make a property appear in the “Search” tab of the editor?
A) [Searchable] B) [EditorHint("Search")] C) [Display(GroupName = SystemTabNames.Search)] D) [ContentSearch] Answer: C Explanation: The [Display] attribute’s GroupName property determines the editor tab; SystemTabNames.Search targets the Search tab. Question 26.Which interface allows a content model to expose navigation information for the site menu? A) INavigable B) IMenuItem C) INavigationPage D) IPageLink Answer: C Explanation: INavigationPage is a common custom interface used to mark pages that should appear in navigation structures. Question 27.How can you restrict a block to be used only on a specific page type? A) Add [AllowedOnPageType(typeof(MyPage))] to the block class B) Use the AllowedTypes property in the ContentArea’s editor settings C) Set the BlockRestrictions in the CMS UI for the block type D) There is no built-in way; you must enforce it in custom validation logic Answer: B Explanation: The ContentArea editor lets you define which block types are permitted, effectively limiting usage to selected pages. Question 28.What is the purpose of the ContentReference property WorkID? A) To store the draft version’s numeric ID B) To identify the published version of the content C) To reference the parent page’s ID D) To hold the language branch identifier
Question 32.What is the effect of setting IsDeleted = true on a content item? A) The item is permanently removed from the database B) The item is hidden from the editor UI but still accessible via API C) The item is moved to the recycle bin and excluded from normal queries D) The item remains visible but cannot be edited Answer: C Explanation: Deleting a content item marks it as deleted, sending it to the recycle bin; standard repository queries ignore deleted items unless explicitly requested. Question 33.How can you programmatically create a new page of a custom type? A) Instantiate the page class with new and save it with IContentRepository.Save B) Call CreatePage(parentReference, name, guid) on IContentRepository C) Use IContentFactory.Create(parentReference) then set properties and save D) Pages cannot be created via code; they must be created in the CMS UI Answer: C Explanation: IContentFactory.Create(parentReference) creates an instance of the specified page type, after which you set properties and persist with Save. Question 34.What property on a ContentArea determines the order in which blocks are rendered? A) SortOrder B) DisplayOrder C) Index D) The order is defined by the sequence of items in the ContentArea collection Answer: D Explanation: The ContentArea internally stores a collection of ContentAreaItems; their order in the list dictates rendering sequence. Question 35.How do you enable caching for a block’s rendered output? A) Add [Cache] attribute to the block controller action B) Set CacheProfile in the view’s @outputcache directive
C) Configure a CacheSettings entry in web.config for the block type D) Use Response.Cache.SetCacheability(HttpCacheability.Public) in the action Answer: B Explanation: The Razor @outputcache directive (or the newer ResponseCache attribute) controls caching of the block’s view output. Question 36.Which attribute tells the editor to display a property as a rich text editor? A) [RichText] B) [EditorDescriptor(EditorDescriptorType = typeof(RichTextEditorDescriptor))] C) [UIHint("RichText")] D) [Display(Type = "RichText")] Answer: C Explanation: [UIHint("RichText")] selects the rich text editor template for the property. Question 37.What interface can be implemented to provide custom logic when a content item is being deleted? A) IDeleteHandler B) IContentDeleteHandler C) IBeforeDelete D) IContentEvents Answer: D Explanation: IContentEvents (or more specifically IContentEvents with Deleting event) allows you to hook into the delete lifecycle. Question 38.How can you retrieve a block’s content reference from a ContentAreaItem? A) item.BlockReference B) item.ContentLink C) item.Reference D) item.ContentReference Answer: B
A) PageController B) ContentController C) BasePageController D) MVCController Answer: A Explanation: PageController is the generic base that provides the CurrentPage property and routing support for page types. Question 43.How can you override the default view used by a page controller without changing file names? A) Return View("MyCustomView") from the action method B) Set ViewPath property in the controller’s constructor C) Use [ViewName("MyCustomView")] attribute on the controller class D) Place a view named Index.cshtml in a folder named after the page type Answer: A Explanation: Explicitly returning View("MyCustomView") selects a different view file. Question 44.What attribute is used to hide a property from the editor entirely? A) [ScaffoldColumn(false)] B) [EditorBrowsable(EditorBrowsableState.Never)] C) [Display(AutoGenerateField = false)] D) [Ignore] Answer: A Explanation: [ScaffoldColumn(false)] tells the CMS to omit the property from the editor UI. Question 45.How does Optimizely decide which view to use for a block when multiple view files exist? A) It picks the view with the same name as the block type in the Views/Blocks folder B) It selects the view based on a naming convention: _.cshtml C) It uses the first view file it finds alphabetically
D) It reads a configuration entry in blocksettings.json Answer: B Explanation: When display options are used, the view name pattern _.cshtml is applied; otherwise it falls back to .cshtml. Question 46.What is the purpose of the ContentReference.EmptyReference constant? A) To indicate a null reference that will be ignored by the repository B) To represent a reference to the site root C) To signal that the property should inherit its value from the parent page D) To reset a content reference field to “no selection” Answer: D Explanation: ContentReference.EmptyReference clears the reference, effectively setting the field to “no content selected”. Question 47.How can you make a property multilingual but share the same value across all languages? A) Set [CultureSpecific] on the property B) Omit [CultureSpecific]; the property will be language-independent C) Use [InvariantCulture] attribute D) Set the property type to InvariantString Answer: B Explanation: Properties without [CultureSpecific] are stored once and shared across all language branches. Question 48.What method of IContentRepository can be used to retrieve the start page for a specific site? A) GetSiteStartPage B) GetRootPage C) GetChildren with a filter for IsStartPage D) GetDescendants and find the page where IsStartPage is true Answer: A Explanation: GetSiteStartPage returns the configured start page for the site (or culture).
C) ContentReference.GetUrl() extension method D) LinkGenerator.GetPathByContentId(contentReference.ID) Answer: A Explanation: UrlResolver is the service that translates a ContentReference into a friendly URL. Question 53.What attribute is used to mark a property as a collection of links (e.g., for a navigation menu)? A) [LinkCollection] B) [ContentArea] C) [LinkItemCollection] D) [LinkList] Answer: C Explanation: LinkItemCollection represents a list of LinkItems, each containing URL, text, and target information. Question 54.How do you make a property appear only for a specific culture in the editor? A) Use [CultureSpecific(Culture = "en")] B) Use [Display(CultureSpecific = true, SupportedCultures = new[] { "en" })] C) Set the property’s AvailableCultures in the UI configuration D) Optimizely does not support per-culture property visibility out of the box Answer: D Explanation: Property visibility cannot be limited to a single culture via attributes; you would need custom UI logic. Question 55.What is the purpose of the IContentVersionRepository? A) To store draft versions only B) To manage publishing schedules C) To retrieve and manage specific content versions (draft, published, archived) D) To handle content type definitions Answer: C Explanation: IContentVersionRepository provides methods for accessing particular versions of a content item.
Question 56.How can you add a new custom field type that appears in the editor’s property picker? A) Create a class inheriting from PropertyData and register it in PropertyDataFactory B) Add a new enum value to PropertyDataType C) Use [CustomField] attribute on a string property D) Extend the CMS UI with JavaScript only; no backend changes needed Answer: A Explanation: Custom property types are built by inheriting PropertyData and registering the type so the editor knows how to render it. Question 57.What method on IContentRepository returns the root content (site start) for a given language? A) GetRootPage(language) B) GetSiteStartPage(language) C) GetRootContent(language) D) GetStartPage(language) Answer: B Explanation: GetSiteStartPage can be called with a language branch to retrieve the start page for that culture. Question 58.How can you programmatically publish a draft page? A) Call IContentRepository.Publish(pageReference) B) Set page.Status = Published and save C) Use IContentPublisher.Publish(pageReference) D) Call IContentRepository.Save(page, new SaveOptions { Publish = true }) Answer: D Explanation: Passing Publish = true in SaveOptions tells the repository to publish the content after saving. Question 59.What attribute can be applied to a controller action to restrict it to GET requests only? A) [HttpGet]
Answer: A Explanation: CultureInfo.CurrentUICulture reflects the culture that Optimizely set for the request. Question 63.What does the IsDeleted flag indicate when querying content via IContentRepository.GetChildren? A) Items with IsDeleted = true are included by default B) Items with IsDeleted = true are excluded unless IncludeDeleted = true is specified C) The flag has no effect on repository queries D) It causes the items to be returned as DeletedContent objects Answer: B Explanation: By default, deleted items are filtered out; you can override this behavior with specific loader options. Question 64.How do you define a content type that should appear under a custom group in the CMS UI? A) Set GroupName in the [ContentType] attribute B) Use [Display(GroupName = "CustomGroup")] on the class C) Add the type to a folder named after the group in the admin UI D) There is no grouping for content types, only for properties Answer: A Explanation: GroupName in [ContentType] determines the group shown in the “Create new” dialog. Question 65.What is the purpose of the IContentJobScheduler? A) To schedule publishing and unpublishing actions for content items B) To run background indexing jobs C) To manage asynchronous rendering of blocks D) To schedule cleanup of expired media files Answer: A Explanation: IContentJobScheduler lets you queue jobs such as “publish this page at a future date”.
Question 66.How can you make a property appear as a dropdown list of predefined values? A) Use [SelectOne] attribute B) Define an enum type for the property and use [UIHint("Enum")] C) Apply [Dropdown] with a list of options D) Use [Display(Options = new[] { "A", "B" })] Answer: B Explanation: When a property’s type is an enum, Optimizely automatically renders a dropdown for selection. Question 67.What method of IContentRepository retrieves the most recent version of a content item regardless of publication status? A) GetLatestVersion B) GetContentVersion C) GetVersion(ContentReference, versionNumber: 0) D) Get(ContentReference, loaderOptions: new LoaderOptions { ResolveLatest = true }) Answer: D Explanation: Setting ResolveLatest = true tells the repository to return the newest version (draft or published). Question 68.How do you add a custom validation error to a specific property in IValidate.Validate? A) Throw an exception with the property name B) Use validationResults.Add(new ValidationResult("Error", new[] { "PropertyName" })) C) Call ModelState.AddModelError("PropertyName", "Error") D) Return a string with the error message Answer: B Explanation: Adding a ValidationResult that includes the property name registers the error for that field. Question 69.What attribute can be used to hide a property from the editor but still persist its value? A) [ScaffoldColumn(false)]