MVC metatdataprovider и HTML помощники - PullRequest
1 голос
/ 15 марта 2012

У меня есть своя собственная реализация метаданного провайдера, в ней проверяется мой собственный атрибут и получается метаданные из базы данных.

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) где-то еще.

Любое предложение приветствуется.

ура

1 Ответ

0 голосов
/ 26 марта 2012

Хорошо, наконец, на правильном пути с небольшой помощью от расширений MVC http://mvcextensions.codeplex.com/SourceControl/changeset/view/f71bcadf0e76#Trunk%2fMvcExtensions%2fModelMetadata%2fModelMetadataRegistry.cs

В моем случае я не должен переопределять

 protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType,
                                                    Func<object> modelAccessor, Type modelType, string propertyName)

из DataAnnotationsModelMetadataProvider, но переопределяю методы Getот AssociatedMetadataProvider, как этот:

  public override IEnumerable<ModelMetadata> GetMetadataForProperties(object container, Type containerType)

И поместите туда вызовы базы данных hte.

...