5

私はASP.NETMVCを読んでいて、そのすべての楽しい使い方を読んでいて、DataTemplatesについて知りました。

このことをテストするために急いで、私は私のより単純なモデルの1つを使用に変換しました@Html.DisplayForModel()@Html.EditForModel()そしてそれはそれがそうであるという幸運な魅力のように働きました:)

しかし、すぐに気付いたのは、表示ビューに表示するフィールドを簡単に定義することはできなかったが、編集用にまったく存在しないことでした...

4

3 に答える 3

12

IMetadataAware インターフェイスを使用して、メタデータで ShowForEdit と ShowForDislay を設定する属性を作成できます。

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class TemplatesVisibilityAttribute : Attribute, IMetadataAware
{
    public bool ShowForDisplay { get; set; }

    public bool ShowForEdit { get; set; }

    public TemplatesVisibilityAttribut()
    {
        this.ShowForDisplay = true;
        this.ShowForEdit = true;
    }

    public void OnMetadataCreated(ModelMetadata metadata)
    {
        if (metadata == null)
        {
            throw new ArgumentNullException("metadata");
        }

        metadata.ShowForDisplay = this.ShowForDisplay;
        metadata.ShowForEdit = this.ShowForEdit;
    }

}

次に、次のようにプロパティにアタッチできます。

public class TemplateViewModel
{
  [TemplatesVisibility(ShowForEdit = false)]
  public string ShowForDisplayProperty { get; set; }

  public string ShowAlwaysProperty { get; set; }
}

必要なのはこれだけです。

于 2011-04-07T15:44:29.503 に答える
2

カスタムメタデータプロバイダーを作成し、ShowForEditメタデータプロパティを設定できます。したがって、カスタム属性から始めます。

public class ShowForEditAttribute : Attribute
{
    public ShowForEditAttribute(bool show)
    {
        Show = show;
    }

    public bool Show { get; private set; }
}

次に、カスタムモデルメタデータプロバイダー:

public class MyModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
    protected override ModelMetadata CreateMetadata(
        IEnumerable<Attribute> attributes,
        Type containerType, 
        Func<object> modelAccessor, 
        Type modelType, 
        string propertyName
    )
    {
        var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
        var sfea = attributes.OfType<ShowForEditAttribute>().FirstOrDefault();
        if (sfea != null)
        {
            metadata.ShowForEdit = sfea.Show;
        }
        return metadata;
    }
}

次に、このプロバイダーを次の場所に登録しますApplication_Start

ModelMetadataProviders.Current = new MyModelMetadataProvider();

そして最後に飾る:

public class MyViewModel
{
    [ShowForEdit(false)]
    public string Prop1 { get; set; }

    public string Prop2 { get; set; }
}

今、あなたの見解であなたが持っているなら:

@model MyViewModel

<h2>Editor</h2>
@Html.EditorForModel()

<h2>Display</h2>
@Html.DisplayForModel()

プロパティはProp1エディターテンプレートに含まれません。

ShowForDisplay備考:メタデータプロパティでも同じことができます。

于 2011-04-07T15:24:51.733 に答える
0

Html.DisplayTextbox またはその他のオプションのいずれかを使用して、必要な各フィールドを表示できますか? そうすれば、フィールドを参照する外観とラベルをカスタマイズすることもできます。

于 2011-04-07T15:25:35.580 に答える