2010-08-05 4 views
12

मैं एएसपी.नेट एमवीसी में एक सामान्य नियंत्रक को लागू करने के बारे में सोच रहा हूं।asp.net mvc जेनेरिक नियंत्रक

PlatformObjectController<T> 

जहां टी एक (जेनरेट) प्लेटफ़ॉर्म ऑब्जेक्ट है।

क्या यह संभव है? क्या अनुभव/दस्तावेज़ीकरण है?

उदाहरण के लिए एक संबंधित प्रश्न यह है कि परिणामी यूआरएल कैसे हैं।

+0

आप प्रत्येक 'T' के लिए मार्गों कॉन्फ़िगर करने के लिए ... या रनटाइम पर कुछ देखने जादू होगा। इसके लिए प्रदर्शन प्रभाव हैं, लेकिन इसके अलावा, ऐसा लगता है कि यह एक अच्छा विचार होगा। – 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

ठीक है - तो मेरी समस्या हल करने योग्य है। यदि प्रकार पैरामीटर के लिए प्रकार उत्पन्न होता है, और आधार नियंत्रक सामान्य रूप से कार्यान्वित किया जाता है, तो मुझे बस इतना करना है कि प्रत्येक प्रकार के लिए व्युत्पन्न नियंत्रक उत्पन्न करना है जिसे मैं टाइप पैरामीटर के रूप में उपयोग करना चाहता हूं। यह उतना आसान हो सकता है जितना हो सकता है। कूल! –