Как использовать DefaultModelBindingMessageProvider в ModelBinders - PullRequest
0 голосов
/ 18 декабря 2018

У нас есть пользовательский DateTimeModelBinder, который раньше нормально работал с ASP.NET Core 1.1, но после обновления до 2.2 он не работает.Это разрывная часть:

            bindingContext.ModelState.TryAddModelError(
                    bindingContext.ModelName,
                    bindingContext.ModelMetadata.ModelBindingMessageProvider.ValueMustNotBeNullAccessor(
                        valueProviderResult.ToString()));

Ошибка:

Method not found: 'Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.IModelBindingMessageProvider Microsoft.AspNetCore.Mvc.ModelBinding.ModelMetadata.get_ModelBindingMessageProvider()'.

Неисправная часть:

bindingContext.ModelMetadata.ModelBindingMessageProvider

Очевидно, что-то изменилось.Я нашел это сообщение, объясняющее немного об этом критическом изменении, но все это:

https://github.com/aspnet/Announcements/issues/240

Очевидно, что мы должны использовать DefaultModelBindingMessageProvider сейчас, но как все приложение разделяетобщий, включая связующие для моделей?

Проблема в ModelBinders bindingContext.ModelMetadata.ModelBindingMessageProvider, используемая для определения класса, содержащего строки, но теперь он указывает на абстрактный класс и, следовательно, завершается с ошибкой, указанной выше.

Использование этого вместо этого работает, но обновление этого класса для каждого использования кажется неправильным (также, изменения в переводах не будут отражены).

            bindingContext.ModelState.TryAddModelError(
                    bindingContext.ModelName,
                    new DefaultModelBindingMessageProvider().ValueMustNotBeNullAccessor(
                        valueProviderResult.ToString()));

Я чувствую, что должен быть в состоянии установитьсвойство ModelBindingMessageProvider ModelMetadata в bindingContext в моих файлах Startup.cs, но я не узнал, как (или я на правильном пути).Я?

1 Ответ

0 голосов
/ 19 декабря 2018

Это действительно работает, как показывает первый фрагмент кода.Моя проблема состояла в том, что показанный код был в пакете nuget, который зависел от Microsoft.AspNetCore.Mvc версии 1.1.3.В проекте, где я использовал пакет nuget, я просто переопределил Microsoft.AspNetCore.Mvc до версии 2.2.0 и предположил, что это достаточно хорошо (код был одинаковым для обеих реализаций).

Но я предположил, что это неправильноКод идентичен, но ModelBindingMessageProvider был изменен на абстрактный класс / объект (из обычного класса / объекта) и, следовательно, с использованием скомпилированного пакета nuget для 1.1.3 продолжал указывать на неправильный тип, который не был / не мог бытьобновленный 2.2.0 aspnetcore.Обновление зависимости в пакете nuget до версии 2.2.0 позволило пакету nuget работать очень хорошо.

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