Serenity 表单默认值

Serenity Form Default Values

如何根据网格中的查找过滤器从 table Id 字段中获取最大值?

我有一个显示 table 客户记录的网格和一个具有不同位置的查找过滤器。我想在位置查找过滤器中使用来自客户的最大值设置新表单中的 ID 字段。

我可以将 Id 字段设置为静态值,如 99。但是如何将其设置为客户的最大值 table?我的代码如下:

@Serenity.Decorators.registerClass()
    export class UtentesGrid extends Serenity.EntityGrid<UtentesRow, any> {
        protected getColumnsKey() { return 'IpssDB.Utentes'; }
        protected getDialogType() { return UtentesDialog; }
        protected getIdProperty() { return UtentesRow.idProperty; }
        protected getInsertPermission() { return UtentesRow.insertPermission; }
        protected getLocalTextPrefix() { return UtentesRow.localTextPrefix; }
        protected getService() { return UtentesService.baseUrl; }

        constructor(container: JQuery) {
            super(container);
        }

        protected addButtonClick() {
            this.editItem(<IpssDB.UtentesRow>{
                Codigo: 99
            });
        }

    }

在服务器端(可能是端点)是否还有一个事件会在单击添加按钮时被调用并且允许我执行 C# 代码?这将使我有更多的“自由”来扫描数据库。

PS:

我是这样解决问题的:

构建了一个助手:

public static GetUtenteNextNumberResponse GetUtenteNextNumber(IDbConnection connection, GetUtenteNextNumberRequest request)
    {
        
        var min = connection.Query<string>(new SqlQuery()
            .From("Locais")
            .Select("UtenteCodMin")
            .Where("Codigo = " + request.Local))
            .FirstOrDefault();

        var minN = (string.IsNullOrEmpty(min) ? 0 : int.Parse(min));

        var minCod = connection.Query<string>(new SqlQuery()
            .From("Utentes")
            .Select("Codigo")
            .Where("Codigo >= " + minN ))
            .FirstOrDefault();

        var response = new GetUtenteNextNumberResponse();

        var n = 0;
        response.Number = minCod == null ||
            !int.TryParse(minCod, out n) ? minN + 1 : n + 1;

        return response;
    }

并且在 Grid.ts 中:

protected addButtonClick() {
            var eq = this.view.params.EqualityFilter;
            var local = 0
            local = eq ? eq.Local : 0;
            var ultCod = 0;

            IPSS.IpssDB.UtentesService.GetUtenteNextNumber({
                Local: local,
                User: '' 
            }, response => {
                    this.editItem(<IpssDB.UtentesRow>{
                        Codigo: response.Number,
                        Local: eq ? eq.Local : null
                    });
            });
        }

现在的问题是新表单假定我正在编辑记录而不是创建新记录,并且“保存”按钮显示为“更新”。我想这是因为我正在更改关键字段。

有办法克服这个问题吗?或者还有别的办法吗? 如果在单击网格中的添加新按钮时调用了一个事件或端点,允许 return 具有默认值的实体,那就完美了。

问题已解决!

我试图拦截错误的事件。我应该拦截但不知道的事件是 loadEntity 而不是 afterLoadEntity.

所以我保持助手不变,只是替换了 'UtentesDialog.ts' 代码,如下所示:

"UtentesDialog.ts"

        protected loadEntity(data) {
            super.loadEntity(data);
            var local = 0;
            local = data.Local;
            if (this.isNew())
                this.getNextNumber(local);
        }

        private getNextNumber(local) {
            IPSS.IpssDB.UtentesService.GetUtenteNextNumber({
                Local: local,
                User: '' 
            }, response => {
                    this.form.Codigo.value = response.Number;
                    });
            };

我还必须将 addButtonClick 保留在 'UtentesGrid.ts' 中以获取本地值,以便我可以在对话框表单中获取它。否则我将无法获取本地过滤器的值(也许还有另一种方法,我不知道)。

"UtentesGrid.ts"

protected addButtonClick() {
            var eq = this.view.params.EqualityFilter;
            var local = 0
            local = eq ? eq.Local : 0;
            this.editItem(<IpssDB.UtentesRow>{
                //Codigo: ultCod,
                Local: eq ? eq.Local : null
            });
        }