0

我試圖實現這種mechanizm實現的通用模型無關的控制器類:ASP.NET MVC,實體框架:用行動

型號有位字段:is_active,所以我用它來切換主要形式的可見性。在DC型的動作是這樣的:

public ActionResult Toggle(int id) 
    { 
     Country country = _db.Countries.Find(id); 
     country.is_active = country.is_active == null ? true : !country.is_active; 
     _db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

我想我的管理員查找控制器從通用類派生和使用實施從它像撥動共同行動。

我已經創建了具有ActionResult Toggle(int id)的ITogglable接口,所以我在特定的控制器(CountryController : Controller, ITogglable)中實現它,但我必須每次都實現它。相反,我會更喜歡我的CountryController,RegionController等從一個通用類派生(即Togglable)具有這些樣的方法已經等來實現:

public virtual ActionResult Toggle(int id) 
{ 
    CurrentModelTypeUsedInController lookup = _db.CurrentModelTypeUsedInController.Find(id); 
    lookup .is_active = lookup .is_active == null ? true : !lookup.is_active; 
    _db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

這甚至可能嗎?我不知道如何使它查找無關,所以我不必每次都提供CurrentModelTypeUsedInController的類型。

回答

3

你需要幾個抽象來實現這一點。

首先,你需要定義is_active的抽象,如

public interface IActive 
{ 
    bool is_active { get; set; } 
} 

和所有的類型,如CountryCurrentModelTypeUsedInController將需要實現這個抽象

public class Country : IActive 
{ 
    public bool is_active { get; set; } 
} 

而與此我們定義了通用控制器。這裏的關鍵點是放置在通用類型TModelType)上的通用約束IActive)。通過定義,所有類型的TModelType必須實現IActive代碼知道該類型保證公開一個名爲is_active

public class AbstractController<TModelType> : Controller 
    where TModelType : class, IActive 
{ 
    private readonly DbContext _db; 

    public AbstractController() 
    { 
     _db = new DbContext("connection"); 
    } 

    public ActionResult Toggle(int id) 
    { 
     TModelType instance = _db.Set<TModelType>().Find(id); 
     instance.is_active = instance.is_active == null ? true : !instance.is_active; 
     _db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
} 

財產,每個控制器可以從AbstractController<>

public sealed class CountryController : AbstractController<Country> 
{ 
} 
+1

我只想說得出,你真棒! –