You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Acumatica自定义属性赋值以实现动态下拉列表?

实现Acumatica动态下拉列表(从JSON获取选项)

要实现从JSON动态加载下拉选项,你需要改造自定义属性的逻辑,让它能够解析JSON并动态注入选项值,而不是初始化时固定传参。以下是具体实现方案:

1. 定义JSON解析辅助类

先写一个工具类,负责将JSON内容解析为Acumatica下拉列表需要的键值对格式:

using System.Collections.Generic;
using System.IO;
using System.Linq;
using Newtonsoft.Json;

public static class JsonDropdownHelper
{
    // 直接解析JSON字符串为键值对列表
    public static List<Tuple<string, string>> ParseOptionsFromJson(string json)
    {
        if (string.IsNullOrWhiteSpace(json)) return new List<Tuple<string, string>>();
        
        var optionList = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(json);
        return optionList.Select(kv => Tuple.Create(kv.Key, kv.Value)).ToList();
    }

    // 从API接口获取JSON并解析(同步调用,适配Acumatica环境)
    public static List<Tuple<string, string>> FetchOptionsFromApi(string apiUrl)
    {
        using (var client = new System.Net.Http.HttpClient())
        {
            var jsonContent = client.GetStringAsync(apiUrl).Result;
            return ParseOptionsFromJson(jsonContent);
        }
    }

    // 从本地JSON文件加载选项
    public static List<Tuple<string, string>> LoadOptionsFromFile(string filePath)
    {
        if (!File.Exists(filePath)) return new List<Tuple<string, string>>();
        
        var jsonContent = File.ReadAllText(filePath);
        return ParseOptionsFromJson(jsonContent);
    }
}

2. 改造自定义下拉属性

创建支持动态加载的属性,继承PXStringListAttribute,在缓存附加时加载JSON选项:

using System.Collections.Generic;
using PX.Data;

public class DynamicJsonDropdownAttribute : PXStringListAttribute
{
    private readonly string _source; // 可以是JSON字符串、API地址或文件路径
    private bool _optionsLoaded;

    public DynamicJsonDropdownAttribute(string source)
    {
        _source = source;
    }

    public override void CacheAttached(PXCache cache)
    {
        base.CacheAttached(cache);
        LoadDynamicOptions();
    }

    private void LoadDynamicOptions()
    {
        if (_optionsLoaded) return;

        List<Tuple<string, string>> options;
        // 根据来源类型加载选项
        if (_source.StartsWith("http"))
        {
            options = JsonDropdownHelper.FetchOptionsFromApi(_source);
        }
        else if (File.Exists(_source))
        {
            options = JsonDropdownHelper.LoadOptionsFromFile(_source);
        }
        else
        {
            // 默认当作JSON字符串解析
            options = JsonDropdownHelper.ParseOptionsFromJson(_source);
        }

        // 更新下拉列表的可选值和显示标签
        _AllowedValues = options.Select(t => t.Item1).ToArray();
        _AllowedLabels = options.Select(t => t.Item2).ToArray();
        _optionsLoaded = true;
    }

    // 提供手动刷新选项的方法
    public void RefreshOptions()
    {
        _optionsLoaded = false;
        LoadDynamicOptions();
    }
}

3. 在DAC字段中使用动态属性

根据你的JSON来源类型,在字段上添加属性:

#region FieldLocation
public abstract class fieldLocation : BqlString.Field<fieldLocation> { }
[PXDBString(5, IsUnicode = true)]
[PXUIField(DisplayName = "Field Location")]
// 示例1:直接传入JSON字符串
[DynamicJsonDropdown(@"[{""key"":""BA"",""value"":""BillingAddress""},{""key"":""PYMT"",""value"":""Payment""},{""key"":""EXTAT"",""value"":""Extension Attributes""}]")]
// 示例2:从API接口获取
// [DynamicJsonDropdown("https://your-api-domain/get-dropdown-options")]
// 示例3:从本地文件加载
// [DynamicJsonDropdown(@"C:\Acumatica\Configs\location-options.json")]

public string FieldLocation { get; set; }
#endregion

4. 可选:添加手动刷新功能

如果需要在界面手动刷新下拉选项,可以在图(Graph)中添加动作:

public PXAction<YourDAC> RefreshDropdownOptions;
[PXButton(CommitChanges = true)]
[PXUIField(DisplayName = "Refresh Dropdown")]
protected virtual IEnumerable refreshDropdownOptions(PXAdapter adapter)
{
    var cache = Base.Caches[typeof(YourDAC)];
    var dropdownAttr = cache.GetAttributes<YourDAC.fieldLocation>()
                            .OfType<DynamicJsonDropdownAttribute>()
                            .FirstOrDefault();
    
    if (dropdownAttr != null)
    {
        dropdownAttr.RefreshOptions();
        cache.RaiseFieldUpdated<YourDAC.fieldLocation>(cache.Current as YourDAC, null);
    }
    return adapter.Get();
}

注意事项

  • 若使用API接口,需确保Acumatica服务器能访问该接口,必要时配置代理或权限
  • 本地文件路径需使用Acumatica服务器可访问的路径,避免权限问题
  • 同步调用API可能导致界面阻塞,若数据量较大,可考虑异步加载并优化

内容的提问来源于stack exchange,提问作者vachmir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:10:31