asp.net против ядра asp.net - объект, переданный как ссылка, не обновляется в ядре - PullRequest
0 голосов
/ 04 мая 2019

Я использую шаблон службы / хранилища и проверку, как описано в этого руководства . Службы имеют свойство ValidationDictionary.

   public interface IValidationDictionary
    {
        void AddError(string key, string errorMessage);
        bool IsValid { get; }
    }

Услуги вводятся в ctor контроллеров. В теле конструктора установлено свойство validationdictioary. Я использую класс-обертку для обтекания состояния модели контроллера.

 public AuthenticationController(
        IOptionsMonitor<PasswordOptions> optionsAccessor,
        AppUserService appUserService,
        ILogger<AuthenticationController> logger, IConfiguration config) : base(logger, config)
    {
        _passwordOptions = optionsAccessor.CurrentValue;
        _appUserService = appUserService;
        _appUserService.ValidationDictionary = new ModelStateWrapper(ModelState);
    }

   public class ModelStateWrapper : IValidationDictionary
    {
        private readonly ModelStateDictionary _modelState;

        public ModelStateWrapper(ModelStateDictionary modelstate)
        {
            _modelState = modelstate;
        }

        public void AddError(string key, string errorMessage)
        {
            _modelState.AddModelError(key, errorMessage);
        }

        public bool IsValid => _modelState.IsValid;
    }

В сервисе, когда проверка идет не так, я добавляю ошибку в словарь проверки.

ValidationDictionary.AddError("", ErrorMessages.PasswordIsRequired);

Когда проверочный справочник содержит какие-либо ошибки, исключение DataValidationException вызывается.

    if (!ValidationDictionary.IsValid)
    {
        throw new DataValidationException();
    }

Это исключение фиксируется в контроллере для обновления представления с дополнительными ошибками в состоянии модели.

Этот подход хорошо работал в asp.net, но в ядре asp.net он больше не работает.

Когда я проверяю проверку в сервисе, он содержит все ожидаемые ошибки Вернувшись в контроллер после отлова исключения, ModelState находится в исходном состоянии = состояние перед переходом в службу.

Когда я перемещаю присваивание состояния модели в проверочный словарь из конструктора в начало действия. Работает нормально.

      public async Task<IActionResult> Register(RegisterVM VM)
        {
            try
            {
                _appUserService.ValidationDictionary = new ModelStateWrapper(ModelState);
....

Это очень подвержено ошибкам, поэтому совершенно не желательно.

В качестве обходного пути я добавил свойство для службы только с геттером.

  protected AppUserService AppUserService
    {
        get
        {
            if (_appUserService.ValidationDictionary == null)
            {
                _appUserService.ValidationDictionary = new ModelStateWrapper(ModelState);
            }
            return _appUserService;
        }
    }

Есть предложения по лучшему решению?

1 Ответ

0 голосов
/ 16 мая 2019

Состояние модели создается в момент создания контроллера, но снова оно создается при вызове метода.Следовательно, ссылка на состояние модели, созданное во время создания элемента управления, фактически ссылается на состояние модели, которое не будет обновляться при вызове метода.

Решение состоит в обращении к состоянию модели только в тот момент, когда вы вызываете метод.Следовательно, упомянутый обходной путь является фактическим окончательным решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...