我有自己的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方法中)。
任何建议都表示赞赏。
欢呼声
答案 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数据库调用放在那里。