Relatude Help

Code decides: code defaults

A code default says what renders every page of a type that has no template:

builder.AddRelatudeCMS()
    .AddMvcRendering().AddRazorPagesRendering()
    .AddRendering(o => o
        .RenderRazorView<IHomePage>("Home")             // Views/Shared/Home.cshtml
        .RenderRazorView<IArticle>()                    // no name: the type's, so Views/Shared/Article.cshtml
        .RenderMvcController<ISectionPage>("Section")   // SectionController.Index
        .RenderRazorPage<ILandingPage>("Landing")       // Pages/Landing.cshtml
        .RenderRazorView<IPage>("Default"));            // every other page
Call Renders the type with
RenderRazorView<IArticle>() the view Article: the type's name without its I
RenderRazorView<IArticle>("ArticleWide") the view ArticleWide
RenderRazorView<IProduct>(p => p.InStock ? "Product" : "SoldOut") a view chosen per page, or none for null
RenderMvcController<INewsList>("News") NewsController.Index; ("News", "List") for another action
RenderRazorPage<ILandingPage>("Landing") Pages/Landing.cshtml
RenderResult<IFeed>((http, feed) => Results.Text(…)) any IResult: JSON, a Blazor component, a file (chapter 11)
Render<ICampaign>(c => c.Live ? new RazorViewTarget("Live") : new RazorViewTarget("Teaser")) any target, chosen per page

A default covers its type and every type derived from it. The closest type wins:

IPage ◄── IArticle ◄── INews        RenderRazorView<IPage>("Default")
                                    RenderRazorView<IArticle>()

an INews     → "Article"     IArticle is one step up, IPage two
an IProduct  → "Default"     only the IPage default covers it

A second default for the same type replaces the first. Code defaults work for any content type, not only pages.

ViewPerType() suits sites where every type has a view named after it. Content that nothing else renders gets that view, so an IFaqPage renders with FaqPage. It is off by default.