簡體   English   中英

基於 Ucommerce 中的枚舉值創建自定義數據類型

[英]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>

我希望這就足夠了,除非您想同時使用RadioButtonEnum ,如果是這種情況請告訴我,我會看看是否有可能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM