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 和逻辑放在正确的层中)
- 在 Application.Contracts 层中带有数据注释的 DTO。
- DTOValidator class继承自DTO和
IValidatableObject
并在Application.Contracts层实现Validate(...)
方法。这是为了在客户端和应用程序服务之间保持简单的 DTO。
- 继承自 DTOValidator 并绑定到 .cshtml.cs 中的模型 class(示例:
public class IndexPolicies : UpdatePolicyDtoValidator {}
)
您可以取消表单提交,直接调用申请服务。然后使用 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()
相同的服务器验证
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 和逻辑放在正确的层中)
- 在 Application.Contracts 层中带有数据注释的 DTO。
- DTOValidator class继承自DTO和
IValidatableObject
并在Application.Contracts层实现Validate(...)
方法。这是为了在客户端和应用程序服务之间保持简单的 DTO。 - 继承自 DTOValidator 并绑定到 .cshtml.cs 中的模型 class(示例:
public class IndexPolicies : UpdatePolicyDtoValidator {}
)
您可以取消表单提交,直接调用申请服务。然后使用 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()
相同的服务器验证