Criterion null reference when using SelectionFactoryType

Hi,

I've followed the documentation on creating criterions:

http://world.episerver.com/documentation/Items/Developers-Guide/Episerver-CMS/9/Personalization/Personalization/

However when I try to drop in the new critierion I get an Object reference not set to an instance of an object.-exception.

If I remove the "SelectionFactoryType"-property on the "DojoWidget"-attribute everything works fine.

public class Group: CriterionModelBase
    {
        [Required]
        [DojoWidget(
            WidgetType = "dijit/form/Select",
            SelectionFactoryType = typeof(GroupSelectionFactory))]
        public string GroupName { get; set; }

        public override ICriterionModel Copy()
        {
            return ShallowCopy();
        }
    }
[VisitorGroupCriterion(
        Category = "",
        Description = "",
        DisplayName = "")]
    public class Critierion : CriterionBase<Group>
    {
        public override bool IsMatch(IPrincipal principal, HttpContextBase httpContext)
        {
            try
            {
                int groupId;
                if (!int.TryParse(Model.GroupName, out groupId))
                    return false;
                // validation
            }
            catch (Exception ex)
            {
                // logging
                return false;
            }
        }
    }
public class GroupSelectionFactory : ISelectionFactory
    {

        public IEnumerable<ISelectItem> GetSelections(ExtendedMetadata metadata)
        {
            // Get stuff from db
            return allGroups.Select(group => new SelectItem
            {
                Text = group.GroupName,
                Value = Convert.ToString(group.GroupId)
            });
        }
    }


If I create a custom UI the exception is thrown on Line 3

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 

Line 1:  <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Folkspel.WebSites.Web.Business.VisitorGroups.SmilerGroup>" %>
Line 2:  <%@ Import Namespace="EPiServer.Personalization.VisitorGroups" %>
Line 3:  <%= Html.DojoEditorFor(m => Model.GroupName) %>

Attaching full exception details below:

[NullReferenceException: Object reference not set to an instance of an object.]
   EPiServer.Personalization.VisitorGroups.DojoHtmlExtensions.DojoDropDownFor(HtmlHelper`1 html, PropertyInfo p, Object htmlAttributes, String label, String labelCssClass, LabelPosition labelPosition, DojoWidgetAttribute attr) +99
   EPiServer.Personalization.VisitorGroups.DojoHtmlExtensions.DojoEditorFor(HtmlHelper`1 html, PropertyInfo propertyInfo, Object htmlAttributes, String label, String labelCssClass, LabelPosition labelPosition) +241
   EPiServer.Personalization.VisitorGroups.DojoHtmlExtensions.DojoEditorFor(HtmlHelper`1 html, Expression`1 expression, Object htmlAttributes, String label, String labelCssClass) +98
   EPiServer.Personalization.VisitorGroups.DojoHtmlExtensions.DojoEditorFor(HtmlHelper`1 html, Expression`1 expression) +87
   ASP.views_shared_editortemplates_smilergroup_ascx.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in c:\Projects\Folkspel\WebSites-Web\Src\Folkspel.WebSites.Web\Views\Shared\EditorTemplates\SmilerGroup.ascx:3
   System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +262
   System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +79
   System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +159
   System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) +75
   System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +79
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +8920

Any leads or clues would be greatly appreciated.
#148617 May 18, 2016 14:46
  • Hi,

    I'm not sure, but maybe in your GroupSelectionFactory you are using EPiServer.Shell.ObjectEditing.ISelectionFactory, but you should EPiServer.Personalization.VisitorGroups.ISelectionFactory:

    public class GroupSelectionFactory : EPiServer.Personalization.VisitorGroups.ISelectionFactory
        {
    	
    	// you should implement different methd
     /*
            public IEnumerable<ISelectItem> GetSelections(ExtendedMetadata metadata)
            {
                // Get stuff from db
                return allGroups.Select(group => new SelectItem
                {
                    Text = group.GroupName,
                    Value = Convert.ToString(group.GroupId)
                });
            }
    		*/
    		
    		public IEnumerable<SelectListItem> GetSelectListItems(Type propertyType)
    		{
    		 // Get stuff from db
                return allGroups.Select(group => new SelectItem
                {
                    Text = group.GroupName,
                    Value = Convert.ToString(group.GroupId)
                });
    		}
        }

    #148626 May 18, 2016 19:16
  • Hi, Grzegorz Wiecheć  

    And thank you. That was it. The documentation could be clearer on which interface to implement, but now when I see it, it's obvious.

    #148631 May 19, 2016 6:52
  • One could argue that ISelectionFactory for both interfaces was not the best naming :)

    #148633 May 19, 2016 9:24
First   1   Last