基本控制器或访问共享资源的方法

时间:2016-08-02 14:38:44

标签: c# asp.net-mvc

我一直在读基础控制器,我似乎无法理解这个概念。我需要简化控制器中的代码,因为我只是重复代码。我使用数据库来收集网站的数据,并构建一些列表以供在视图中使用。所有页面共享我在基本控制器中复制的两个列表。当我删除pagescontroller中的列表时,我得到一个错误,即当前上下文中不存在名称“sliders”和“partenaires”。什么是防止重复代码的最佳方法?

这是我的基本控制器:

public class BaseController : Controller
{
    PIAEntities db = new PIAEntities();

    public BaseController()
    {
        var sliders = db.Actualite.Where(a => a.Afficher).OrderByDescending(a => a.Date_publication);
        var partenaires = db.Partenaire.Where(p => p.Afficher);
    }
}

这是管理我所有页面的控制器的一部分

public class PagesController : BaseController
{
    public PagesController() : base()
    {

    }

    PIAEntities db = new PIAEntities();

    public ActionResult Activités()
    {
        var sliders = db.Actualite.Where(a => a.Afficher).OrderByDescending(a => a.Date_publication);
        var partenaires = db.Partenaire.Where(p => p.Afficher);
        var model = new ModelDeBase { Slider = sliders, Partenaire = partenaires };

        return View(model);
    }

    public ActionResult Actualités()
    {
        var sliders = db.Actualite.Where(a => a.Afficher).OrderByDescending(a => a.Date_publication);
        var pageActualites = db.Actualite.OrderByDescending(a => a.Date_publication).Take(10);
        var donateurs = db.Donateur.Where(d => d.Afficher);
        var partenaires = db.Partenaire.Where(p => p.Afficher);
        var model = new ModelActualite { Slider = sliders, Partenaire = partenaires, PageActualite = pageActualites, Donateur = donateurs };

        return View(model);
    }
}

解决方案

好的,现在它可以工作,我最终在我的基本控制器中使用它

public class BaseController : Controller
{
    PIAEntities db = new PIAEntities();
    protected IEnumerable<Actualite> sliders { get; private set; }
    protected IEnumerable<Partenaire> partenaires { get; private set; }

    public BaseController()
    {
        sliders = db.Actualite.Where(a => a.Afficher).OrderByDescending(a => a.Date_publication);
        partenaires = db.Partenaire.Where(p => p.Afficher);
    }
}

和Pages控制器:

public class PagesController : BaseController
{
    public PagesController() : base()
    {

    }

    PIAEntities db = new PIAEntities();

    public ActionResult Activités()
    { 
        var model = new ModelDeBase { Slider = sliders, Partenaire = partenaires };

        return View(model);
    }

    public ActionResult Actualités()
    {
        var pageActualites = db.Actualite.OrderByDescending(a => a.Date_publication).Take(10);
        var donateurs = db.Donateur.Where(d => d.Afficher);
        var model = new ModelActualite { Slider = sliders, Partenaire = partenaires, PageActualite = pageActualites, Donateur = donateurs };

        return View(model);
    }
}

5 个答案:

答案 0 :(得分:2)

您正在收到该错误,因为您现在只是声明构造函数范围内的对象。要修复,在构造函数之外声明它们并在构造函数内设置值(不确定我是否正确使用了类型,必须从示例中扣除它们)。

public class BaseController : Controller
{
    PIAEntities db = new PIAEntities();
    IQueryable<Actualite> sliders;
    IQueryable<Paternaire> partenaires;

    public BaseController()
    {
        sliders = db.Actualite.Where(a => a.Afficher).OrderByDescending(a => a.Date_publication);
        partenaires = db.Partenaire.Where(p => p.Afficher);
    }
}

答案 1 :(得分:1)

使用您当前的代码,您正在查询Actualite在BaseController的构造函数中添加Partenaire,并且您的PagesController正在继承。但是在您的“活动”操作方法中,您再次查询相同的数据!当用户请求Pages/Activites时,它将执行您的BaseController构造函数代码和Activity控制器中的代码。所以你有重复的代码。您在BaseController构造函数中查询的数据也被设置为一个变量(具有该方法的局部范围),而不是在任何其他地方使用。你可以做的一件事是保留一些受保护的变量并分配给它。 您可以在子类中访问这些受保护的变量

public class BaseController : Controller
{
    protected List<Actualite> Actualities {set;get;}
    PIAEntities db = new PIAEntities();

    public BaseController()
    {
        this.Actualities  = db.Actualite.Where(a => a.Afficher)
                           .OrderByDescending(a => a.Date_publication).ToList();            
    }
}

现在在PageController中,您可以只使用this.Actualites。你不需要再次查询。

public ActionResult Activités()
{
    var model = new ModelDeBase { Slider = this.Actualities };
    return View(model);
}

您可以为其他系列做同样的事情。

由于构造函数中包含该代码,因此对从BaseController继承的任何控制器的任何调用都将调用它。但是您的某些操作方法可能不需要此数据(但仍希望使用其他基本控制器变量/方法)。在这种情况下,我建议您将其移至服务类并根据需要调用

public class PageService
{
  public IEnumerable<Actualite> GetActualites()
  {
     return db.Actualite.Where(a => a.Afficher)
                                .OrderByDescending(a => a.Date_publication).ToList();
  }
}

现在在您的控制器中,您可以创建一个对象并根据需要调用GetActualites方法。

public ActionResult Activités()
{
    var s=new PageService();
    var model = new ModelDeBase { Slider =s.GetActualites()};
    return View(model);
}

您可以更进一步,使用依赖注入框架提取接口并注入具体实现。这将帮助您对控制器进行单元测试。

答案 2 :(得分:1)

sliderspartenaires这两个变量都在BaseController构造函数的范围内声明,因此在构造函数外部无法访问它们。

您应该在类级别将其声明为private setter,以便子类无法更改这些属性。

public class BaseController : Controller
{
    PIAEntities db = new PIAEntities();

    protected IEnumerable<Actualite> sliders { get; private set; }

    protected IEnumerable<Paternaire> partenaires { get; private set; }

    public BaseController()
    {
        this.sliders = db.Actualite.Where(a => a.Afficher).OrderByDescending(a => a.Date_publication);
        this.partenaires = db.Partenaire.Where(p => p.Afficher);
    }
}

答案 3 :(得分:0)

你必须在基本控制器中创建它们的字段或属性,目前在构造函数中有局部变量,将其更改为:

public class BaseController : Controller
{
   PIAEntities db = new PIAEntities();

   // Fields added
   protected IQueryable<Partenaire> partenaires ;
   protected IQueryable<Actualite> sliders ;

   public BaseController()
   {

       sliders = db.Actualite.Where(a => a.Afficher).OrderByDescending(a => a.Date_publication);
       partenaires = db.Partenaire.Where(p => p.Afficher);
   }
}

现在,您将能够访问将从此基本控制器继承的其他控制器。

答案 4 :(得分:0)

在基本控制器中添加几个字段以保存滑块和放大器的值。 partenaires。然后,您可以在构造函数中设置它们。

this._sliders = db.Actualite.Where(a => a.Afficher).OrderByDescending(a => a.Date_publication);

然后,您应该能够从派生控制器访问这些字段