如何为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
相关产品推荐
相关产品推荐

