Access Current Page using DI and UmbracoContextFactory
Hi forum and friends,
I am creating an umbraco that gives possibility to host multiple websites. I use a pattern where Settings are stored as pages and Blocks, same for Menus (as Pages) that are all descendants of Home.
I then have multiple homes, within folders to organize them.
My issue is that code is been reused for each site : I have a MenuController (vanilla Controller) Registered with MapRoute and correctly loaded when I call a @Html.Action
Now, In this Controller, I need to access the Settings Page within the Home node I am.
My idea was to do something like : currentNode . AncestorOrSelf("home").ChildrenOfType("settings").
errr I don't know where to get "currentNode" within the controller.
And this RenderMenu Html.Action is called from master, right before RenderBody(). When I try to pass the Model to Html.Action, and cast it into IPublishedContent, it's a null value.
You could have your controller action accept a guid parameter and pass in the key of the current page, or the key of the current page's root home node. I'm assuming your Master template is inheriting from UmbracoViewPage so it knows the current page it is rendering.
and passing in my HeaderViewModel a :
_homepage.GetHomePage(data as IPublishedContent).Url(),
where _homepage is a IHomePageService that I get from DI, and GetHomePage a method Where I reference IUmbracoContextFactory to gather the homepage starting from the data param passed.
A bit tricky and complicated I assume. Could be better...
What do you think of this solution ?
I just have to make sure that the dynamic data is the right type of Object.
If expecting a IPublishedContent in :
public ActionResult RenderHeader(IPublishedContent data){
Access Current Page using DI and UmbracoContextFactory
Hi forum and friends,
I am creating an umbraco that gives possibility to host multiple websites. I use a pattern where Settings are stored as pages and Blocks, same for Menus (as Pages) that are all descendants of Home.
I then have multiple homes, within folders to organize them.
My issue is that code is been reused for each site : I have a MenuController (vanilla Controller) Registered with MapRoute and correctly loaded when I call a @Html.Action
Now, In this Controller, I need to access the Settings Page within the Home node I am.
My idea was to do something like : currentNode . AncestorOrSelf("home").ChildrenOfType("settings").
errr I don't know where to get "currentNode" within the controller.
And this RenderMenu Html.Action is called from master, right before RenderBody(). When I try to pass the Model to Html.Action, and cast it into IPublishedContent, it's a null value.
Thanks guys for your help !!
Definitely looking forward to trying v9
Hi WMOTR,
You could have your controller action accept a guid parameter and pass in the key of the current page, or the key of the current page's root home node. I'm assuming your Master template is inheriting from UmbracoViewPage so it knows the current page it is rendering.
Thanks
Nik
Hi @Nik, Thanks for answering
I found out by myself this week a solution :
@Html.Action("RenderHeader", "RenderElements", Model.Page)
in RenderElementsController :
public ActionResult RenderHeader(dynamic data){
and passing in my HeaderViewModel a : _homepage.GetHomePage(data as IPublishedContent).Url(),
where _homepage is a IHomePageService that I get from DI, and GetHomePage a method Where I reference IUmbracoContextFactory to gather the homepage starting from the data param passed. A bit tricky and complicated I assume. Could be better...
What do you think of this solution ?
I just have to make sure that the dynamic data is the right type of Object.
If expecting a IPublishedContent in : public ActionResult RenderHeader(IPublishedContent data){
The data object is null every time...
Thanks for taking the time to answer, again
Sylvain
is working on a reply...