[英]Create a custom datatype based on enum values in Ucommerce
任何人都可以帮助我如何创建一个自定义数据类型,它的工作方式与枚举完全一样,但在我的例子中,编辑器必须被称为“单选按钮”。 因此,这些值将通过“创建数据类型枚举”选项填充。
我已经阅读了https://docs.ucommerce.net/ucommerce/v8.1/extending-ucommerce/custom-data-type.html上的文档,但不清楚如何获取这样的数据,它只是解释了我如何从数据源(示例中的 _priceGroupRepository)获取信息。
就像这个模拟。
从您发送的文档看来,您只需要返回一个 RadioButtonList 而不是 DropDownList,请尝试使用System.Web.UI.WebControls.RadioButtonList
要替换枚举数据类型,您需要将编辑器返回为“Enum”而不是“PriceGroupPicker”,并且在注册组件时,您需要使用此 ID id="DropDownListControlFactory"
,因为您想要覆盖 Enum Factory。
我测试了如何在本地获得所需的单选按钮行为,这是我的发现:
您只能通过替换枚举的当前行为来执行此操作,因为这是唯一具有在 Ucommerce 中添加数据类型枚举字段的功能的枚举。
ControlFactory 应如下所示:
您可以看到我正在扩展IEnumerable<DataTypeDefinition>
以获得枚举的功能。 并且还将 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>
我希望这就足够了,除非您想同时使用RadioButton
和Enum
,如果是这种情况请告诉我,我会看看是否有可能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.