Controllers (Route Hi-Jacking)
* Controllers are completely optional, but recommended to make the most out of the CMS
If you want to have your own Model passed to a View it works exactly like a normal MVC app. We can create a controller, and a custom View Model and pass these to the View. You just have to adhere to naming conventions.
Naming Conventions
The naming convention is pretty simple. The controller name, must match your 'Content Type' alias, and the ActionResult name must match the View you are wanting to use. Also, all controllers need to inherit from
ZauberRenderController
Example below shows the Home Content Type Controller from the starter site.
/public class HomeController(ILogger<HomeController> logger, IOptions<ZauberSettings> options, IMediator mediator)
: ZauberRenderController(logger, options, mediator)
{
private readonly IMediator _mediator = mediator;
/// <summary>
/// Route hijacked controller, 'Home' ContentType and 'Home' View
/// </summary>
/// <returns></returns>
public async Task<IActionResult> Home()
{
var homeViewModel = new HomeViewModel(CurrentPage!)
{
// Get the header image
HeaderImage = await CurrentPage!.GetMedia("HeaderImage", _mediator, "/assets/img/home-bg.jpg")
};
// Get the blog posts
var posts = await _mediator.Send(new QueryContentCommand
{
AmountPerPage = 4,
ContentTypeAlias = "BlogPage",
OrderBy = GetContentsOrderBy.DateUpdatedDescending,
Cached = true
});
homeViewModel.BlogPosts = posts.Items.ToList();
return CurrentView(homeViewModel);
}
}
As you can see, we have a custom view model called HomeViewModel and this is passed to the View using CurrentView() which is also important.
Using the View name as the ActionResult, means you can have different ActionResults for each View, so for differently layouts you could (Optionally) pass in
View Location
By default the Views are searched for in the Views folder route, but if you want to keep the normal MVC Views convention you can. So for the Home Controller, you can also put your views in /Views/Home/ if that's how you like to organise your views.
Custom View Models
Custom View Models must inherit from
ZauberPageViewModel
The example below, shows the full view model for the Home View Model used above in the controller.
public class HomeViewModel(Content content) : ZauberPageViewModel(content)
{
public Media? HeaderImage { get; set; }
public List<Content> BlogPosts { get; set; } = [];
}
CurrentPage
CurrentPage gets the Content model for the current page you are on.
Last updated