2010-08-05 2 views
12

Я думаю о внедрении универсального контроллера в ASP.NET MVC.asp.net mvc generic controller

PlatformObjectController<T> 

где T - (сгенерированный) объект платформы.

Возможно ли это? Есть ли опыт/документация?

Одним из связанных вопросов является, например, то, как получаются URL-адреса.

+0

Вы должны настроить маршруты для каждого '... или Т * выполнить некоторую поисковую магию во время выполнения. Для этого есть последствия для производительности, но помимо этого, похоже, это была бы хорошая идея. – bzlm

ответ

18

да это, вы просто не можете использовать его напрямую, но вы можете наследовать его и использовать Чайлдс

здесь один, который я использую:

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

и обыкновений:

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) 
     { 
     } 
    } 

код здесь: http://code.google.com/p/asms-md/source/browse/trunk/WebUI/Controllers/FieldController.cs

обновление:

, используя этот подход сейчас здесь: http://prodinner.codeplex.com

+0

Хорошо - так моя проблема разрешима. Если тип для параметра типа сгенерирован, а базовый контроллер в целом реализован, все, что мне нужно сделать, это создать производный контроллер для каждого типа, который я хочу использовать в качестве параметра типа. Это так просто, как может быть. Прохладный! –