2010-11-12 32 views
7

'daki varsayılan EditorFor şablon seçimini geçersiz kıluyorum, şu anda çok fazla görüntüyü genellemek için EditorFor kullanan bir MVC uygulaması oluşturuyorum. Bütün görünüm temelde sadece bir EditorForModel ve harika çalışıyor. Ancak, bir çözüm bulmayı başaramadığım küçük bir soruna ulaştım ve buna ihtiyacım olan şekilde çalışması ve EditorFor'u bir arayüz haline getirmeye çalışması önemli. Bağlantılar ve bunun gibi her şey halledildi, ama sorun şu ki, EditorFor bir arabirim olduğunu ve varsayılan olarak "Nesne" şablonunu görüyor. Arabirimine bakmak ve bu isimle bir şablon bulabilir mi diye görmem gerekiyor ve eğer yapamazsa, bunlarla eşleşip eşleşmediğini görmek için mevcut tüm arayüzlere bakmak gerekiyor.ASP.NET MVC 3 RC

arayüzleri: daha sadece bu örneğe göz açıklamak için şimdi modeli = "IAppMusicProvider" ile bir görünümü oluşturmak ve Html.EditorForModel() çalıştırırsanız

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. 

, bunu "~ Görüntüleme bulmalıyız \ Paylaşılan \ EditorTemplates \ IAppProvider.cshtml "-template. Bunu başarabileceğim basit bir yol var mı?

cevap

1

[TemplateHint] özniteliğini kullanmayı denediniz mi?

+0

Evet, çalışır, ancak soruna bir yol değil (ya da daha doğrusu kullandığım aslında [DataType] özniteliği). Yaptığım uygulama eklentileri çalıştıracak ve sadece arabirimi ayarlayarak ve tüm eklenti-geliştiricilerin kullanıcı [DataType ("IAppProvider")] 'e zorlanmasına gerek kalmadan çalışmasına ihtiyacım var. – Alxandr

+0

Şablonu arayüzle aynı şekilde adlandırmayı deneyin. Bunların sadece iki seçenek olduğunu hatırlıyorum. – jfar

+0

Bu da işe yaramaz çünkü şablonun tüm IAppProvider işlevleri için çalışması gerekir. Bu varsayılan davranışı geçersiz kılmanın bir yolunu arıyorum, böylece bir IAppProvider uygulama arabirimi sağladığım takdirde, IAppProvider şablonunu kullanacaktır. Bu muhtemelen MVC'de bir yere kodlanmalıdır (ControllerFactory ile yapabileceğiniz gibi, değiştirilmesi gereken bazı bileşenler), ama nereden başlayacağımı bile bilmiyorum. – Alxandr

1

ModelMetadataProvider'da ModelMetadata.TemplateHint değiştirmeyi deneyebilirsiniz.

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

Ve başlangıç ​​mantığında: Bunu yapmanın bir yolu, dekoratör desenle olan

ModelMetadataProviders.Current = new AbstractTypeTemplateSupportingModelMetadataProvider(ModelMetadataProviders.Current);