Меня перенаправили отсюда: https://github.com/aspnet/AspNetCore/issues/11963
Я нахожусь в процессе преобразования решения из .Net 4.6 и смотрю на метаданные.
В старомРешение У меня была пользовательская реализация поставщика метаданных аннотаций данных, которую я расширил следующим образом ...
public class ApiMetadataProvider : DataAnnotationsModelMetadataProvider, IDisposable
{
public IResourceProvider ResourceProvider { get; }
public ICoreDataContext CoreDb { get; }
public ApiMetadataProvider(IResourceProvider resourceProvider, ICoreDataContext core)
{
ResourceProvider = resourceProvider;
CoreDb = core;
}
protected override ModelMetadata CreateMetadata(
IEnumerable<Attribute> attributes,
Type containerType,
Func<object> modelAccessor,
Type modelType,
string propertyName)
{
ModelMetadata modelMetadata = base.CreateMetadata(
attributes,
containerType,
modelAccessor,
modelType,
propertyName);
Type serverType = (modelType == typeof(string))
? typeof(string)
: modelType.ImplementsGenericInterface(typeof(IEnumerable<>)) ?? modelType;
if (serverType.IsGenericType && serverType.Name.StartsWith("Nullable") && typeof(Nullable<>).MakeGenericType(serverType.GenericTypeArguments) == serverType) { serverType = serverType.GenericTypeArguments[0]; }
modelMetadata.AdditionalValues.Add("ServerType", serverType.AssemblyQualifiedName);
SetTemplateHint(modelMetadata);
SetCustomAttributes(attributes, modelMetadata, modelType, propertyName);
SetResourceStrings(modelMetadata);
return modelMetadata;
}
....
}
... ключевой момент здесь заключается в том, что я извлекаю базовую копию мета-модели модели дляданного типа, а затем манипулировать им по-своему (некоторые из которых показаны в примере выше).
Я вырезал остальное, потому что его довольно много.
В результате получается, что из моего собственного базового универсального контроллера у меня было действие, которое выглядело следующим образом ...
protected MetadataContainer GetMetadataForType(Type type)
{
return new MetadataContainer(MetaProvider.GetMetadataForType(null, type));
}
Контроллеры часто принимали бы решения на основе этого.
Я ищувоспроизведите это поведение, ключевая вещь - способность получить настроенную версию "окончательной мета" из стека (я понимаю из этого: https://github.com/aspnet/Mvc/issues/2522 ... эта мета теперь является "цепочкой провайдеров" внемного моды).
ТакУ меня есть пара вопросов ....
Как я могу добавить или удалить / обновить пользовательские "свойства" / атрибуты в метаинформации для данного типа?Как я могу получить экземпляр мета, который стек рассматривает как «конечный результат» после выполнения всех провайдеров?Существующее решение часто передавало эту метаинформацию клиентскому JS-коду для «динамического конструирования компонентов» в браузере. Это сценарий, в котором есть какая-либо лучшая практика, из которой я могу получить больше советов (возможно, у вас, ребята, есть запись в блоге).или что-то, чтобы начать меня)?