How to evaluate a Condition Rendering Rule from the code

In this post, I'll be covering how to list the Personalization Rules on a given page from a Rendering Controller. In order achieve it, I'll be talking about how to get only the renderings that contain personalization rules and how to evaluate the personalization rule as well.

Recently, I was trying to find a way to list the Personalization Rules on a given page from a Rendering Controller and evaluate which one is currently in action.

I came across to this nice post in the Sitecore Community How to invoke a Condition Rendering Rule from Code , but it did not work for me due to the RuleContext class.

Item item = Sitecore.Context.Item;

Sitecore.Data.Database contextDB = Sitecore.Configuration.Factory.GetDatabase(item.Database.Name);

Sitecore.Data.Items.Item ruleItem = contextDB.GetItem(new Sitecore.Data.ID(SitecoreConstants.ItemGUID), item.Language);

String rule = ruleItem.Fields["Rule"].Value;

var rules = RuleFactory.ParseRules<RuleContext>(item.Database,XElement.Parse(rule));

var ruleContext = new RuleContext() { Item = item };

if (rules.Rules.Any())
  return rules.Rules.First().Evaluate(ruleContext);

It turns out that when you are evaluating Condition Rendering Rule inside a Rendering Controller you need to use ConditionalRenderingsRuleContext instead.

With the help of Diego Moretto in the StackExchange post How can I programmatically list all personalization in my page? I was able to write the code below:

public ActionResult GetPersonalizationRule()
{
    var item = Sitecore.Context.Item;

    Sitecore.Data.Fields.LayoutField layoutField = item.Fields["__renderings"];
    Sitecore.Layouts.RenderingReference[] renderings = layoutField.GetReferences(Sitecore.Context.Device);

    var renderingsWithPersonalization = renderings.Where(r => r.Settings.Rules.Count > 0).ToList();

    List rulesName = new List();

    foreach (var rendering in renderingsWithPersonalization)
        foreach (var rule in rendering.Settings.Rules.Rules)
        {
            var ruleContext = new Sitecore.Rules.ConditionalRenderings.ConditionalRenderingsRuleContext(renderings.ToList(), rendering);
            if (rule.Evaluate(ruleContext)) rulesName.Add(rule.Name);
        }

    return View(rulesName);
}

In the code above, we are getting only the renderings that contain personalization rules .Where(r => r.Settings.Rules.Count > 0).

In Sitecore, you set the personalization rule in the rendering as shown in the image below:

Next, we evaluate the Personalization Rule by creating a ConditionalRenderingsRuleContext with the renderings in the page and the rendering that contains the personalization rule, and by invoking the Evaluate method.

The end result is that I list the name of the Personalization Rules that are currently being displayed in my page:

comments powered by Disqus