7

現在 EditorFor を使用して多くのビューを生成する MVC アプリケーションを作成しています。ビュー全体は、基本的に単なる EditorForModel であり、うまく機能します。ただし、解決策が見つからないように見える小さな問題が 1 つあります。それが必要な方法で機能することが重要です。それは、EditorFor をインターフェイスにレンダリングしようとするときです。バインディングとそのようなものはすべて処理されていますが、問題は、EditorFor がそれがインターフェイスであると認識し、デフォルトで「オブジェクト」テンプレートになることです。インターフェイスを調べて、その名前のテンプレートが見つかるかどうかを確認する必要があります。見つからない場合は、存在するすべてのインターフェイスを調べて、それらのいずれかに一致するかどうかを確認する必要があります。より簡単に説明するには、次の例を見てください。

インターフェース:

public interface IAppProvider
{
    string Name { get; set; }
}

public interface IAppMusicProvider : IAppProvider
{
    int GetPlaylistCount();
} // Yeah, I know, this interface is not smart, but it's only for show.

model = "IAppMusicProvider" でビューを作成し、実行するHtml.EditorForModel()と、"~Views\Shared\EditorTemplates\IAppProvider.cshtml" テンプレートを見つける必要があります。これを達成できる簡単な方法はありますか?

4

2 に答える 2

2

ModelMetadata.TemplateHintで変更してみてくださいModelMetadataProvider。これを行う 1 つの方法は、デコレータ パターンを使用することです。

public class AbstractTypeTemplateSupportingModelMetadataProvider : ModelMetadataProvider
{
    private readonly ModelMetadataProvider wrapped;

    public AbstractTypeTemplateSupportingModelMetadataProvider(ModelMetadataProvider wrapped)
    {
        this.wrapped = wrapped;
    }

    public override IEnumerable<ModelMetadata> GetMetadataForProperties(object container, Type containerType)
    {
        var result = this.wrapped.GetMetadataForProperties(container, containerType).ToList();
        result.ForEach(ChangeTemplateHint);

        return result;
    }

    public override ModelMetadata GetMetadataForProperty(Func<object> modelAccessor, Type containerType, string propertyName)
    {
        var result = this.wrapped.GetMetadataForProperty(modelAccessor, containerType, propertyName);
        ChangeTemplateHint(result);

        return result;
    }

    public override ModelMetadata GetMetadataForType(Func<object> modelAccessor, Type modelType)
    {
        var result = this.wrapped.GetMetadataForType(modelAccessor, modelType);
        ChangeTemplateHint(result);

        return result;
    }

    private void ChangeTemplateHint(ModelMetadata source)
    {
        if (source.Model is IAppProvider) //Or use source.ModelType if you want to support the model being null.
            source.TemplateHint = typeof(IAppProvider).Name;
    }
}

そして、起動ロジックで:

ModelMetadataProviders.Current = new AbstractTypeTemplateSupportingModelMetadataProvider(ModelMetadataProviders.Current);
于 2014-07-10T07:07:34.877 に答える
1

[TemplateHint]属性を使用してみましたか?

于 2010-11-12T02:36:32.587 に答える