ABP 框架 - ValidateModel() 和显示成功消息的最佳方式

ABP framework - Best way to ValidateModel() and show success message

Context:基于 ABP 2.9 框架(Razor 页面)使用 ASPNet Core 开发的 Web 应用程序。

我需要验证一个模型(它从 IValidatableObject 实现 Validate(...) 并调用应用程序服务来执行一些验证),然后调用应用程序服务,最后显示一条成功消息(带有与 abp.notify.success(...)).

相同的外观和感觉

此 post 的目的:验证我是否遵循最佳实践或使用 ABP 框架以正确的方式做事。如果有,给ABP团队一些建议。

我试过的:

1.- 首先,我尝试提交表单,但我没有找到一种简单的方法来显示来自服务器方法的成功消息(如 abp.notify.success 消息):public virtual async Task<IActionResult> OnPostAsync()

最好有一种简单的方法从服务器端发送客户端消息(比如 abp.notify.success 消息)。也许有办法,我没找到。

2.- 其次,我尝试在客户端取消表单提交和验证,调用应用程序服务并显示消息,也是从客户端进行的。这里的问题是 public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 方法的验证不是从客户端调用 form.valid().

执行的

对 ABP 框架的可能改进是启用一种从客户端执行相同服务器 DataValidation() 的简单方法。也许它存在,但我没有找到它。

3.- 最后,我做了以下事情:

a) 服务器端:执行ValidateModel()并调用应用服务(see cshtml.cs code)。

b) Client Side: 避免表单提交,用ajax提交,最后用abp.notify.success(...))显示成功信息(see javascript code).


以下是与之前问题相关的问题。感谢您的意见或建议:

1.- 使用 ABP 框架实用程序是否有更好的方法来执行此场景?

2.- 我是否遵循了最佳实践? (将 classes 和逻辑放在正确的层中)

您可以取消表单提交,直接调用申请服务。然后使用 DataAnnotations 来验证你的 dto。如果您需要在验证中自定义逻辑,您可以在应用程序服务方法中对其进行验证(或创建自定义 DataAnnotation)。

有关从 javascript 端调用应用程序服务的最佳方式,请参阅 https://docs.abp.io/en/abp/latest/Tutorials/Part-1?UI=MVC#dynamic-javascript-proxies

处理另一个问题我找到了一个解决方案,它充分利用了 ABP 框架::

a) 服务器端:执行 ValidateModel() 并调用应用程序服务(与我第三次尝试时描述的相同)。

b) 客户端:使用一个简单的按钮而不是提交按钮,并在成功函数上调用 abpAjaxForm(options)abp.notify.success()。然后提交表格:

var _defaultPoliciesForm = $("#DefaultPoliciesForm");
var _saveButton = $("#SaveButton"); 

_saveButton.click(function (e) {
    var options = {
        beforeSubmit: function (arr, form) {
            _saveButton.buttonBusy(true);
        },
        success: function (responseText, statusText, xhr, form) {
            abp.notify.success(l("UpdatedSuccessfully"));
        },
        complete: function (jqXhr, status, form) {
            _saveButton.buttonBusy(false);
        }
    }
    _defaultPoliciesForm.abpAjaxForm(options);
    _defaultPoliciesForm.submit();
});

希望对遇到同样问题的其他人有用。不管怎样,我记得我给ABP团队的建议:

  • 能够从服务器端发送 abp.notify.success(...) 等客户端消息。

  • 能够从客户端执行与 DataValidation() 相同的服务器验证