0

任何人都可以帮助我如何创建一个自定义数据类型,它的工作方式与枚举完全一样,但在我的情况下,编辑器必须被称为“单选按钮”。因此这些值将通过“创建数据类型枚举”选项填充。

我已阅读https://docs.ucommerce.net/ucommerce/v8.1/extending-ucommerce/custom-data-type.html上的文档,但尚不清楚如何获取这样的数据,它只是解释了我如何从数据源(示例中的 _priceGroupRepository)获取信息。

像这样的模拟。

我想如何设置单选按钮的示例

我想如何添加数据的示例

4

2 回答 2

0

从您发送的文档看来,您只需返回 RadioButtonList 而不是 DropDownList,请尝试使用System.Web.UI.WebControls.RadioButtonList

要替换枚举数据类型,您需要将编辑器返回为“Enum”而不是“PriceGroupPicker”,并且在注册组件时,您需要使用此 ID id="DropDownListControlFactory"来覆盖 Enum Factory。

于 2020-08-24T07:56:40.410 回答
0

我测试了如何在本地获得所需的单选按钮行为,这是我的发现:

您只能通过替换 Enum 的当前行为来做到这一点,因为这是唯一一个具有在 Ucommerce 中添加数据类型枚举字段的功能。

ControlFactory 应如下所示:

您可以看到我正在扩展IEnumerable<DataTypeDefinition>以获取 Enum 的功能。并且还将 priceGroups 的 foreach 替换为 DefinitionFields.DataTypeEnums 的 foreach。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Ucommerce.EntitiesV2;
using Ucommerce.EntitiesV2.Definitions;
using Ucommerce.Presentation.Web.Controls;
using System.Web.UI;
using System.Web.UI.WebControls;
using Ucommerce.Infrastructure.Components.Windsor;
using Ucommerce.Security;
namespace UcommerceSamples.Extensions.Code
{
    public class RadioButtonControlFactory: IControlFactory, IEnumerable<DataTypeDefinition>
    {
        private readonly IDataTypeDefinitionInspector _dataTypeDefinitionInspector;
        private DataTypeDefinition Definition = new DataTypeDefinition("Enum");
        [Mandatory]
        public ITextSanitizer TextSanitizer { get; set; }
        public RadioButtonControlFactory(IDataTypeDefinitionInspector dataTypeDefinitionInspector )
        {
            _dataTypeDefinitionInspector = dataTypeDefinitionInspector;
        }
        public bool Supports(DataType dataType)
        {
            var dataTypeDefinitionName = _dataTypeDefinitionInspector.GetDataTypeDefintion(dataType);
            return dataTypeDefinitionName.Equals(Definition.Name, StringComparison.InvariantCultureIgnoreCase);
        }
        public Control GetControl(IProperty property)
        {
            string stringValue = property.GetValue() != null ? TextSanitizer.SanitizeOutput(property.GetValue().ToString())
                : "";
            var radioButtonListControl = new RadioButtonList()
            {
                ID = TextSanitizer.SanitizeOutput(property.GetDefinitionField().Name)
            };
            foreach (var enumValue in property.GetDefinitionField().DataType.DataTypeEnums.OrderBy(x => x.SortOrder))
            {
                var listItem = new ListItem(TextSanitizer.SanitizeOutput(enumValue.Value),
                    TextSanitizer.SanitizeOutput(enumValue.Value));
                radioButtonListControl.Items.Add(listItem);
            }
            if (radioButtonListControl.Items.FindByValue(stringValue) != null)
                radioButtonListControl.SelectedValue = stringValue;
            radioButtonListControl.CssClass = "uc-drop-down-list";
            return radioButtonListControl;
        }
        public IEnumerator<DataTypeDefinition> GetEnumerator()
        {
            yield return Definition;
        }
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
}

配置应该看起来像这样覆盖DropDownListControlFactory(读取EnumListControlFactory):

<configuration>
        <components>
                <component
                        id="DropDownListControlFactory"
                        service="Ucommerce.Presentation.Web.Controls.IControlFactory, Ucommerce.Presentation"
                        type="UcommerceSamples.Extensions.Code.RadioButtonControlFactory, UcommerceSamples.Extensions" />
        </components>
</configuration>

我希望这已经足够了,除非您想同时使用RadioButtonand Enum,如果是这种情况,请告诉我,我会看看是否有可能。

于 2020-09-03T14:13:28.943 回答