我正在尝试实现这种机制:
模型有位字段:is_active
,所以我用它来切换主表单上的可见性。控制器中的动作类似于:
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");
}
我希望我的管理查找控制器派生自该泛型类,并使用实现从它的常见动作,如切换。
我已经创建了ITogglable接口,有ActionResult Toggle(int id)
,所以我在特定的控制器(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
的类型。
您需要几个抽象来实现这一点。
首先,您需要一个定义is_active
的抽象,例如
public interface IActive
{
bool is_active { get; set; }
}
所有的类型,如Country
和CurrentModelTypeUsedInController
都需要实现这个抽象
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>
{
}