簡體   English   中英

覆蓋ASP.NET MVC 3 RC中的默認EditorFor模板選擇

[英]Overriding the default EditorFor template-selecting in ASP.NET MVC 3 RC

我正在創建一個MVC應用程序,它目前使用EditorFor來生成很多視圖。 整個視圖基本上只是一個EditorForModel,它運行得很好。 但是,我遇到了一個小問題,我似乎無法找到解決方案,並且重要的是它以我需要的方式工作,那就是在嘗試渲染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”創建一個View,並運行Html.EditorForModel() ,我需要它來查找“〜Views \\ Shared \\ EditorTemplates \\ IAppProvider.cshtml”-template。 有什么簡單的方法可以達到這個目的嗎?

您可以嘗試在ModelMetadata.TemplateHint中更改ModelMetadataProvider 一種方法是使用裝飾器模式:

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

您是否嘗試使用[TemplateHint]屬性?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM