コード例 #1
0
        public static IHtmlContent AggregationOperatorHtml(this Column col, Type destinationType, IStringLocalizer localizer, string selection, string selectCss = null)
        {
            if (!col.CanAggregate)
            {
                return(null);
            }
            var expression =
                col.For;
            Type sourceType   = expression.Metadata.ContainerType;
            Type propertyType = expression.Metadata.ModelType;

            if (destinationType == null)
            {
                destinationType = sourceType;
            }
            else if (!sourceType.GetTypeInfo().IsAssignableFrom(destinationType))
            {
                return(null);
            }
            var    path               = expression.Name;
            bool   simple             = path.IndexOf('.') < 0;
            string countDistinctAlias = null;
            var    operations         = QueryAttribute.AllowedAggregationsForType(propertyType, col.Queries.Value);
            string displayName        = null;

            if (!simple)
            {
                operations = operations & (GroupingOptions.Group);
            }
            else if (col.ColumnConnection != null)
            {
                operations  = operations & (GroupingOptions.Group | GroupingOptions.CountDistinct);
                displayName = col.ColumnConnection.DisplayProperty.Name;
            }
            if ((operations & GroupingOptions.CountDistinct) == GroupingOptions.CountDistinct)
            {
                var ti   = destinationType.GetTypeInfo();
                var prop = ti.GetProperty(path + "Count");
                if (prop == null || !canCount(prop.PropertyType))
                {
                    prop = ti.GetProperty(path);
                }
                if (prop != null && canCount(prop.PropertyType))
                {
                    countDistinctAlias = prop.Name;
                }
            }
            if (countDistinctAlias == null)
            {
                operations = operations & (~GroupingOptions.CountDistinct);
            }
            if (operations == GroupingOptions.None)
            {
                return(null);
            }
            var           selections = QueryAttribute.GroupOptionsToEnum(operations);
            StringBuilder sb         = new StringBuilder();

            sb.Append("<select name ='");
            sb.Append(path);
            sb.Append("' ");
            if (displayName != null)
            {
                sb.Append("data-display-name='");
                sb.Append(displayName);
                sb.Append("' ");
            }
            if (!string.IsNullOrEmpty(selectCss))
            {
                sb.Append("class='");
                sb.Append(selectCss);
                sb.Append("' ");
            }
            if (countDistinctAlias != null)
            {
                sb.Append("data-count-distinct='");
                sb.Append(countDistinctAlias);
                sb.Append("' ");
            }
            sb.Append(">");
            foreach (var option in selections)
            {
                sb.Append("<option value='");
                sb.Append(HtmlEncoder.Default.Encode(option.Key));
                sb.Append("' ");
                if (option.Key == selection)
                {
                    sb.Append("selected ");
                }
                sb.Append(">");
                sb.Append(HtmlEncoder.Default.Encode(localizer == null ? option.Value : localizer[option.Value]));
                sb.Append("</option>");
            }
            sb.Append("</select>");
            return(new HtmlString(sb.ToString()));
        }