我一直在读基础控制器,我似乎无法理解这个概念。我需要简化控制器中的代码,因为我只是重复代码。我使用数据库来收集网站的数据,并构建一些列表以供在视图中使用。所有页面共享我在基本控制器中复制的两个列表。当我删除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);
}
}
答案 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)
sliders
和partenaires
这两个变量都在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);
然后,您应该能够从派生控制器访问这些字段