Структура ABP - лучший способ ValidateModel () и показать сообщение об успешном завершении

Контекст: веб-приложение, разработанное с помощью ASPNet Core на платформе ABP 2.9 (страницы Razor).

Мне нужно проверить модель (она реализует Validate(...) из IValidatableObject и вызывает службу приложения для выполнения некоторых проверок), затем вызвать службу приложения и, наконец, показать сообщение об успехе (с тем же внешним видом, что и abp.notify.success(...)).

Цель этого сообщения: проверить, следую ли я передовым методам или правильно ли я работаю с платформой 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() и вызова службы приложения (см. код cshtml.cs).

б) Клиентская сторона: избегайте отправки формы и отправляйте ее с помощью ajax и, наконец, показывайте сообщение об успешном завершении с помощью abp.notify.success(...)) (см. код javascript).


Вот вопросы, связанные с предыдущими проблемами. Я ценю ваши комментарии или предложения:

1.- Есть ли лучший способ выполнить этот сценарий с помощью утилит ABP framework?

2.- Следую ли я лучшим практикам? (размещение классов и логики в правильных слоях)

  • DTO с аннотациями данных в слое Application.Contracts.
  • Класс DTOValidator, который наследуется от DTO и IValidatableObject и реализует метод Validate(...) на уровне Application.Contracts. Это сделано для того, чтобы поддерживать простые DTO между клиентскими и прикладными сервисами.
  • Класс модели, который наследуется от DTOValidator и привязан к форме в .cshtml.cs (пример: public class IndexPolicies : UpdatePolicyDtoValidator {})

person Nacho    schedule 16.06.2020    source источник


Ответы (2)


Вы можете отменить отправку формы и напрямую позвонить в службу поддержки. Затем используйте DataAnnotations для проверки вашего dto. Если вам нужна настраиваемая логика для проверки, вы можете проверить ее в методе службы приложения (или создать настраиваемый DataAnnotation).

См. https://docs.abp.io/en/abp/latest/Tutorials/Part-1?UI=MVC#dynamic-javascript-proxies для лучшего способа вызова службы приложения со стороны javascript.

person Yunus Emre Kalkan    schedule 18.06.2020
comment
Спасибо за ваш ответ! Я протестировал предложенное вами решение (прямой вызов служб приложений и проверка DTO с помощью настраиваемых DataAnnotation), но я также столкнулся с проблемой: проверка выполняется дважды (я думаю, при вызове HttpApi и при вызове службы приложения), и в некоторых случаях это не оптимально ( как мой). С другой стороны, выполнение проверки в методе службы приложения - это не то, что я искал. Видите ли вы другое возможное решение? Нарушает ли моя третья альтернатива какие-либо рекомендации по структуре ABP? - person Nacho; 20.06.2020

Решая другую проблему, я нашел решение, которое решает эту проблему, используя все преимущества структуры ABP:

a) На стороне сервера: для выполнения ValidateModel () и вызова службы приложения (как описано в моей третьей попытке).

б) Клиентская сторона: использовать простую кнопку вместо отправки и вызывать 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() со стороны клиента

person Nacho    schedule 25.06.2020