У меня есть своя собственная реализация метаданного провайдера, в ней проверяется мой собственный атрибут и получается метаданные из базы данных.
public class EntityPropertyMetadataAttribute: Attribute
{
[MaxLength(256)]
public string EntityFullName { get; set; }
[MaxLength(64)]
public string PropertyName { get; set; }
public string DisplayName { get; set; }
public string DisplayFormatString { get; set; }
public string EditFormatString { get; set; }
public object DefaultValue { get; set; }
}
Теперь я заметил следующее, если у меня есть такой вид:
<div class="editor-label">
@Html.LabelFor(model => model.Id)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Id)
@Html.ValidationMessageFor(model => model.Id)
</div>
Функция
protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
вызывается 3 раза для идентификатора свойства, если я, например, удаляю его:
<div class="editor-field">
@Html.EditorFor(model => model.Id)
@Html.ValidationMessageFor(model => model.Id)
</div>
он вызывается 2 раза.
Теперь, когда я использую это:
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
@Html.EditorForModel(Model)
<p>
<input type="submit" value="Create" />
</p>
}
CreateMetadata называется колоссальным 22 для каждого свойства в модели.
Это не совсем то, что вы хотите от производительности. Возможно, мне следует подключить код БД (в настоящее время внутри метода CreateMetadata) где-то еще.
Любое предложение приветствуется.
ура