2010-05-04 9 views
1

J'ai une classe appelée BaseClass qui contient une certaine logique applicable à l'ensemble du site web. Pour créer une vue fortement typée, nous devons hériter de la page de la classe générique System.Web.Mvc.ViewPage. Mais dans notre cas, je dois Hériter la BaseClass de System.Web.Mvc.ViewPage pour appliquer certains paramètres communs, mais la BaseClass doit être héritée de System.Web.Mvc.ViewPage <> version générique. Mais je ne peux pas hériter de la BaseClass à partir de System.Web.Mvc.ViewPage <> car cela changera également l'autre classe. J'ai donc créé une classe de plus de type BaseClass <> en l'héritant de System.Web.Mvc.ViewPage <> et copié le code entier de BaseClass dans BaseClass <>. Mais le code dans BaseClass est contrôlé par une autre équipe donc il sera changé fréquemment afin que mon BaseClass <> soit synchronisé avec BaseClass. S'il vous plaît aidez-moi à éliminer la duplication de code ou toute autre approche pour faire fortement View typé.Créer une vue fortement typée qui hérite d'une classe qui est concrète

Merci Ashwani

+0

Aucune infraction, mais cela semble horrible. Y a-t-il une chance que vous puissiez changer cette configuration? Quelle sorte de logique dans cette 'BaseClass'? J'ai l'impression qu'il serait préférable de contenir la logique ailleurs ... – Charlino

+0

:(, BaseClass contient le thème etc logique connexe applicable pour l'ensemble du site Web –

+0

Pourraient-ils être mis dans un 'BaseController'? 'HtmlHelper' méthodes d'entension? Pourriez-vous modifier votre question pour inclure une partie de cette logique afin que les gens obtiennent une meilleure idée? :-) – Charlino

Répondre

1

Ok ... il semble que vous ne pouvez pas changer l'utilisation de ce BaseClass pour votre point de vue.

Que diriez-vous de dupliquer la logique de ViewPage<TModel>? Jetez un oeil à la ViewPage`1.cs file qui est dans le code source asp.net mvc et dupliquer cela. Ce serait le moyen le plus simple ...

E.g.

public class BaseClass : ViewPage 
{ 
    //Custom logic for africa here 
} 

public class BaseClass<TModel> : BaseClass 
{ 
    //Copy and paste all the code from ViewPage`1.cs 
    //It's not much - about 50 lines. 
} 

HTHS,
Charles

Ps. Le lien vers le code source est pour asp.net mvc 2

+0

Merci Charlino, je vais essayer ça –

+0

Merci Charlino, j'ai travaillé. –

1

Aïe ...

Je ne suis pas sûr de ce que vous avez dans votre BaseClass. Mais je pense que la meilleure option est de créer un BaseViewModel (peut-être votre BaseClass est vous BaseViewModel> puis créer ViewModels spécifiques (qui hérite de BaseViewModel) pour chaque page

Par exemple, votre ViewModels devrait ressembler à ceci:.

public abstract class BaseViewModel 
{ 
    public string SiteTitle {get;set;} 
    public int SomeProperty{get;set;} 
} 

public class UserViewModel: BaseViewModel 
{ 
    public string UserName{get;set;} 
    public string Email{get;set;} 
} 

et vous devez créer vue fortement typé comme ceci:.

System.Web.Mvc.ViewPage<UserViewModel> 

vous pouvez jeter un oeil à AutoMapper pour simplyfy le processus de mise en correspondance de vos classes personnalisées à ViewModels

Vive

+0

Merci Rrejc, dans mon application j'ai BasePage qui hérite de System.Web.Mvc.ViewPage afin d'appliquer un certain réglage de l'interface utilisateur (comme les thèmes etc). Mais pour que la vue fonctionne, j'ai la même interface que j'ai besoin d'hériter de BasePage <> version générique qui dans tern devrait être héritée de ViewPage <>. –

0
public abstract class MyBaseView<T> : ViewPage<T> 
{ 
//common logic here 
} 

public class UserView: MyBaseView<MyUserInfo> 
{} 
Questions connexes