Могу ли я предоставить параметры для пользовательского связывателя модели, на который есть ссылка в атрибуте. Net Core? - PullRequest
1 голос
/ 26 января 2020

Я создал пользовательский механизм связывания моделей, реализующий IModelBinder, и хочу применить его к моим моделям представления с использованием атрибутов. Например:

namespace TestWebApp.Models
{
    public class ExperimentalViewModel
    {
        [ModelBinder(typeof(MandatoryIntBinder))]
        public int MandatoryInt { get; set; }
    }
}

Причина в том, что я могу вернуть свои собственные сообщения об ошибках, если привязка модели не удалась. Для этого я хотел бы передать понятное имя для поля, связанного с используемым экземпляром MandatoryIntBinder. Что-то вроде:

[ModelBinderWithParameters(typeof(MandatoryIntBinder), "Test mandatory int")]

Возможно ли это?

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

1 Ответ

3 голосов
/ 26 января 2020

Я хотел бы передать понятное имя для поля, связанного с используемым экземпляром MandatoryIntBinder

Вам необходимо каким-то образом добавить его в BindingContext. Делать это в общем случае немного сложновато, но для конкретного c случая передачи понятного имени это уже учитывается используемым ModelBinderAttribute.

Если вы укажете Свойство Name в attibute выглядит следующим образом:

    namespace TestWebApp.Models
    {
        public class ExperimentalViewModel
        {
            [ModelBinder(typeof(MandatoryIntBinder), Name = "Test Mandatory Int")]
            public int MandatoryInt { get; set; }
        }
    }

Это будет доступно в связывателе вашей пользовательской модели BindModelAsync как bindingContext.BinderModelName.

Если вам все еще нужно использовать Исходное название модели из вашей папки (например, чтобы получить значение из коллекции форм), вы можете получить к нему доступ через bindingContext.ModelMetadata.Name или bindingContext.ModelMetadata.PropertyName.

Можно ли предоставить параметры для связывателя пользовательской модели, на который есть ссылка в атрибуте. Net Core?

Name - это единственное другое свойство в ModelBinderAttribute. Если вы хотите передать произвольные параметры в пользовательский связыватель для отдельных свойств, вы можете добавить их через дополнительные атрибуты, к которым можно получить доступ из связывателя модели одним из следующих способов:

  1. Внутри пользовательского связывателя приведите bindingContext.ModelMetadata к DefaultModelMetadata и получите доступ к свойству Attributes напрямую (это, возможно, хрупко, но практически вряд ли сломается)
  2. Реализуйте свой собственный IMetadataDetailsProvider, который может смотреть на атрибуты и заполнять метаданные, доступные для подшивки наиболее подходящий, но он может заполнять только BindingMetadata, который имеет только несколько доступных для записи свойств (большинство из которых могут быть установлены другими атрибутами через встроенные поставщики метаданных по умолчанию).
  3. IDisplayMetadataProvider может заполнить DisplayMetadata, который содержит свойство IDictionary<object,object> AdditionalValues, которое может содержать произвольные данные. Обратите внимание, что эти данные также будут доступны в представлениях (которые вам, возможно, не нужны, но не должны вызывать каких-либо проблем).
  4. IValidationMetadataProvider может заполнять ValidationMetadata, который содержит свойство IList<object> ValidatorMetadata, который может содержать произвольные данные. Очевидно, больше подходит для использования во время проверки, но тот факт, что это IList, а не IDictionary, делает несколько менее удобным извлечение данных обратно.
...