2010-08-05 6 views
12

Je pense implémenter un contrôleur générique dans ASP.NET MVC.asp.net mvc contrôleur générique

PlatformObjectController<T> 

où T est un objet de plateforme (généré).

Est-ce possible? Y a-t-il expérience/documentation?

Une question connexe par exemple est comment les URL résultantes sont.

+0

Vous devez configurer des itinéraires pour chaque 'T' ... ou effectuer une recherche de la magie lors de l'exécution. Il y a des implications de performance à cela, mais à part cela, il semble que ce serait une bonne idée. – bzlm

Répondre

18

oui il est, vous ne pouvez pas l'utiliser directement, mais vous pouvez hériter et utiliser les Childs

ici est celui que j'utilise:

 public class Cruder<TEntity, TInput> : Controller 
     where TInput : new() 
     where TEntity : new() 
    { 
     protected readonly IRepo<TEntity> repo; 
     private readonly IBuilder<TEntity, TInput> builder; 


     public Cruder(IRepo<TEntity> repo, IBuilder<TEntity, TInput> builder) 
     { 
      this.repo = repo; 
      this.builder = builder; 
     } 

     public virtual ActionResult Index(int? page) 
     { 
      return View(repo.GetPageable(page ?? 1, 5)); 
     } 

     public ActionResult Create() 
     { 
      return View(builder.BuildInput(new TEntity())); 
     } 

     [HttpPost] 
     public ActionResult Create(TInput o) 
     { 
      if (!ModelState.IsValid) 
       return View(o); 
      repo.Insert(builder.BuilEntity(o)); 
      return RedirectToAction("index"); 
     } 
    } 

et usages:

public class FieldController : Cruder<Field,FieldInput> 
    { 
     public FieldController(IRepo<Field> repo, IBuilder<Field, FieldInput> builder) 
      : base(repo, builder) 
     { 
     } 
    } 

    public class MeasureController : Cruder<Measure, MeasureInput> 
    { 
     public MeasureController(IRepo<Measure> repo, IBuilder<Measure, MeasureInput> builder) : base(repo, builder) 
     { 
     } 
    } 

    public class DistrictController : Cruder<District, DistrictInput> 
    { 
     public DistrictController(IRepo<District> repo, IBuilder<District, DistrictInput> builder) : base(repo, builder) 
     { 
     } 
    } 

    public class PerfecterController : Cruder<Perfecter, PerfecterInput> 
    { 
     public PerfecterController(IRepo<Perfecter> repo, IBuilder<Perfecter, PerfecterInput> builder) : base(repo, builder) 
     { 
     } 
    } 

le code est ici: http://code.google.com/p/asms-md/source/browse/trunk/WebUI/Controllers/FieldController.cs

mise à jour:

utilisant cette approche ici maintenant: http://prodinner.codeplex.com

+0

Ok - donc mon problème est résoluble. Si le type du paramètre type est généré et que le contrôleur de base est implémenté de manière générique, tout ce que je dois faire est de générer le contrôleur dérivé pour chaque type que je veux utiliser comme paramètre de type. C'est aussi simple que possible. Cool! –

Questions connexes