2012-03-15 12 views
1

私は自分のカスタム属性のチェックとデータベースからのメタデータの取得のために、自分自身のメタアタプロプロバイダを実装しています。私は、例えば、1を削除した場合、MVC metatdataproviderとhtmlヘルパー

<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> 

プロパティIDのために3回呼び出さ

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

機能:私はこのようなビューを持っている場合

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-field"> 
     @Html.EditorFor(model => model.Id) 
     @Html.ValidationMessageFor(model => model.Id) 
</div> 

g 2回呼び出されます。 CreateMetadataは、モデル内の各プロパティの22途方もないと呼び出さ

@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 
    @Html.EditorForModel(Model) 
    <p> 
     <input type="submit" value="Create" /> 
    </p> 
} 

: は今、私はこれを使用するとき。 それはあなたがパフォーマンスを賢明にしたいとは思っていません。おそらく、私はDBコード(現在CreateMetadataメソッド内にある)を他の場所に接続するべきです。

ご意見がありがとうございます。 MVC拡張の助けのビットが正しい軌道に乗ってようやく

歓声

+0

独自のメタデータプロバイダではどうしますか? – jgauffin

+0

私は異なる役割を持つユーザーに対して異なる「設定」を行うことができます。 – Jamee

+0

異なるユーザーは、データを表示するときにグループによって異なる設定を使用します。 – Jamee

答えて

0

[OK]を私の場合は http://mvcextensions.codeplex.com/SourceControl/changeset/view/f71bcadf0e76#Trunk%2fMvcExtensions%2fModelMetadata%2fModelMetadataRegistry.cs

私はDataAnnotationsModelMetadataProviderから

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

をオーバーライドするが、取得をオーバーライドするべきではありませんこのようなAssociatedMetadataProviderのメソッド:

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

そしてhteデータベース呼び出しをそこに置きます。

関連する問題