MVC metatdataprovider和html助手

时间:2012-03-15 14:34:19

标签: asp.net asp.net-mvc metadata html-helper

我有自己的metadataprovider实现,在其中检查我的自定义属性并从数据库中获取元数据。

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)

为属性ID调用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 :(得分:0)

最后,在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的

但覆盖了AssociatedMetadataProvider中的Get方法,如下所示:

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

将hte数据库调用放在那里。