Search code examples
sitecoreglass-mappersitecore-mvcsitecore8

Rendering parameters incorrect when multiple of same rendering


I'm having an issue with a rendering I'm building in Sitecore 8 Update 3, using MVC with Glass Mapper v4.

I have a Feature Promo rendering that has a Rendering Parameter Template Feature Promo Parameters which defines a droplist field named Align with the possible values Left and Right.

When in Experience Editor and Preview mode the rendering renders correctly and when debugging RenderingContext.Current["Parameters"] contains Align=Left or Align=Right accordingly, and Glass maps this correctly to my POCO.

However, when in web mode, the first rendering has Align=Left as its parameter, all subsequent renderings of the same type have Align with no value.

Checking the layout XML in the web database via Sitecore Rocks, I can see the parameters are there correctly:

<r p:p="1" xmlns:p="p" xmlns:s="s">
    <d id="{FE5D7FDF-89C0-4D99-9AA3-B5FBD009C9F3}">
        <r p:before="r[@uid='{CAE5DB0F-1971-4931-939B-9F7DB14AF0F8}']" 
           s:ds="{F63266A5-CC62-4915-9D89-CB01C7A0D05A}" 
           s:id="{6BA52384-D976-499D-8A0D-7F729EB4376B}" 
           s:par="Align=Left" s:ph="main" 
           uid="{4CBD0824-D232-46F9-8763-295D3B493A4F}"/>
        <r p:before="r[@uid='{12A7C72A-1821-4F8D-9A87-745604BE5106}']" 
           s:ds="{C50C7579-3680-46C3-93B2-9429EB9E0100}" 
           s:id="{6BA52384-D976-499D-8A0D-7F729EB4376B}" 
           s:par="Align=Right" s:ph="main" 
           uid="{CAE5DB0F-1971-4931-939B-9F7DB14AF0F8}"/>
        <r p:before="*[1=2]" uid="{12A7C72A-1821-4F8D-9A87-745604BE5106}"/>
    </d>
</r>

No matter what I do, the second (and any subsequent renderings of the same type) doesn't get the specified parameter value.

The code of the rendering is as follows:

@model Promo
@{
    var settings = Html.Glass().GetRenderingParameters<FeaturePromoParameters>();
    var alignment = "feature-promo-style-a";
    if (settings != null && settings.Align.EqualsText("Right")) {
        alignment = "feature-promo-style-b";
    }
}

<div class="feature-promo @alignment">
    <div class="layout layout-a">
         <div class="region region-a">
            <div class="region-inner">
                <div class="feature-promo-image-container">
                    @Html.Glass().Editable(m => m.Image)
                </div>
                <div class="block block-size-b feature-promo-text">
                    @if (Html.Glass().IsInEditingMode || !Model.PreTitle.IsEmptyOrNull()) {
                        <div class="pre-title">@Html.Glass().Editable(m => m.PreTitle)</div>
                    }
                    @if (Html.Glass().IsInEditingMode || !Model.Title.IsEmptyOrNull()) {
                        <h2 class="h3 color-a">@Html.Glass().Editable(m => m.Title)</h2>
                    }
                    @Html.Glass().Editable(m => m.Body)
                </div>
            </div>
        </div>
    </div>
</div>

Can anyone advise what I'm doing wrong, or if I've found a random bug?

Update for Marek Musielak:

OK, its now only hitting the breakpoint once -- and has the uid of the first rendering on the page: {4CBD0824-D232-46F9-8763-295D3B493A4F}. Could this turn out to be something dynamic placeholders related?

RenderingContext.CurrentOrNull.Rendering["Parameters"] = "Align=Left"


Solution

  • This appears to be due to caching... oh the shame.

    The renderings had Cacheable unchecked, and no other caching settings selected.

    I've just updated them to have Cacheable checked and Vary by Parameters checked, re-published and its now working correctly.

    I would have thought that having Cacheable off would mean the rendering would not be cached, but apparently not.

    Thanks.