错误 CS0592:属性 'PXForeignReference' 在此声明类型上无效。它仅对 'class, property, indexer' 声明有效

error CS0592: Attribute 'PXForeignReference' is not valid on this declaration type. It is only valid on 'class, property, indexer' declarations

美好的一天

我需要覆盖采购订单屏幕上的 InventoryID 字段。我想通过在屏幕级别覆盖它来使该字段成为必填字段:

namespace PX.Objects.PO
{
  public class POOrderEntry_Extension : PXGraphExtension<POOrderEntry>
  {
    #region Event Handlers
    
    
    [PXDefault]
    [POLineInventoryItem(Filterable = true)]
    [PXForeignReference(typeof(Field<inventoryID>.IsRelatedTo<InventoryItem.inventoryID>))]
    protected virtual void POLine_InventoryID_CacheAttached(PXCache cache)
    {
    
    }
    
    #endregion
  }
}

当我 运行 以上我得到以下错误: \App_RuntimeCode\POOrderEntry.cs(45):错误 CS0592:属性 'PXForeignReference' 在此声明类型上无效。它仅对 'class, property, indexer' 声明有效。

第 45 行是 [PXForeignReference(typeof(Field.IsRelatedTo))]

我该如何解决这个错误?

我不认为外部引用在 CacheAttached 的上下文中是“合法的”。您应该能够使用 PXMergeAttrubutes 添加 PXDefault 而不会删除其他属性。

[PXMergeAttributes(Method = MergeMethod.Append)]
[PXDefault]
protected virtual void POLine_InventoryID_CacheAttached(PXCache cache){}

我做了类似的事情来阻止在 SOLine 上使用特定项目 Class。

#region SOLine_InventoryID_CacheAttached  
[PXMergeAttributes(Method = MergeMethod.Append)]
[PXRestrictor(typeof(Where<InventoryItem.itemClassID,
    NotEqual<Current<MySetup.PreventClassID>>>),"")]
protected virtual void SOLine_InventoryID_CacheAttached(PXCache sender) { }
#endregion

如果您想定义何时需要,您也可以考虑 PXUIRequiredAttribute。我相信此属性可用于 DAC 扩展或 CacheAttached。

#region MyDAC_AccountID_CacheAttached
[PXMergeAttributes(Method = MergeMethod.Append)]
[PXDefault()]
[PXUIRequired(typeof(Where<Current<MyDAC.hold>, Equal<False>,
                        And<Current<MyBranchSetting.requireAccount>, Equal<True>>>))]
protected virtual void MyDAC_AccountID_CacheAttached(PXCache sender) { }
#endregion