Passing Parameters to a Sitecore MVC ItemRendering
A recent question from fellow Sitecore MVP Jason St-Cyr and this question on StackOverflow prompted me to investigate how to pass parameters from a parent rendering to an item rendering.
The simplest way to call an ItemRendering
is like this:
@Html.Sitecore().ItemRendering(item)
To pass a value to the item renderings we should be able to use something like this:
@Html.Sitecore().ItemRendering(item, new { Message = "Hello World" })
and then in our child rendering, use the following to access the value passed in the parent rendering:
@Html.Sitecore().CurrentRendering.Properties["Message"] //cshtml
//or
RenderingContext.Current.Rendering.Properties["Message"] //controller code
Unfortunately due to a bug (or feature?) in Sitecore this does not work correctly.
Work around
One of the things I like about Sitecore MVC is the great flexibility you have in the presentation API and fortunately there is another method, @Html.Sitecore().Rendering()
which we can use instead. It takes the ID (or path) of the rendering definition item and a parameters argument where a datasource can be set. Because the datasource item must have its __Renderers
field set to a rendering ID to work as an ItemRendering, we can read this and pass it to the Rendering()
method as shown below:
@Html.Sitecore().Rendering(item["__Renderers"],
new {
Datasource = item.ID,
Message = "Hello World"
})
Hopefully this will be useful to someone. If you have any comments, questions or suggestions, feel free to leave a comment below!