ASP.. NET MVC,实体框架:用动作实现的通用的独立于模型的控制器类



我正在尝试实现这种机制:

模型有位字段: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; } 
}

所有的类型,如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>
{
}

相关内容

  • 没有找到相关文章

最新更新