2013-12-16 98 views
0

我创建了一个内容类型“俱乐部”,我添加了部分名称“课程”。我想在我的控制器代码中获得俱乐部(内容类型)列表。按内容类型筛选果园CMS

public ActionResult Index(PagerParameters pagerParameters, CourseSearchVM search) 
    { 
     //this is displaying only published content 
     var courseQuery = _contentManager.Query<CoursePart>().List().ToList(); 
     // Project the query into a list of customer shapes 
     var coursesProjection = from course in courseQuery 
            select Shape.course 
            (
            Id: course.Id, 
            Name: course.Name, 
            Description: course.Description 
           ); 

     // The pager is used to apply paging on the query and to create a PagerShape 
     var pager = new Pager(_siteService.GetSiteSettings(), pagerParameters.Page, pagerParameters.PageSize); 
     // Apply paging 
     var coures = coursesProjection.Skip(pager.GetStartIndex()).Take(pager.PageSize); 
     // Construct a Pager shape 
     var pagerShape = Shape.Pager(pager).TotalItemCount(courseQuery.Count()); 
     // Create the viewmodel 
     var model = new CourseIndexVM(coures, search, pagerShape); 
     return View(model); 
    } 

回答

0

你必须让你的控制器访问IContentManager,你可以这样做只是将其添加到构造函数(见依赖注入,autofac会做的伎俩)。除了这一点,你可以用IOrchardServices,这将让你获得一些常见的服务(做,如果你想使用两个依赖从它)

 public MyController(IOrchardServices services){ 
     this.services = services; 
    } 

在你的行动,你可以做这样的事情:

 services.ContentManager.HqlQuery() 
      .ForType("Club").List() 
      .Select(ci => services.ContentManager.BuildDisplay(ci, "Summary")); 

,第一部分将创建您的ContentType的列表,其内容部分,那么它只是项目的结果形状的名单,在这之后,你可以将这些形状到另一个,以显示名单。

完成操作:

 var clubs = services.ContentManager.HqlQuery() 
      .ForType("Club").List() 
      .Select(ci => services.ContentManager.BuildDisplay(ci, "Summary")); 

     var shape = services.New.ClubList(); 
     shape.Clubs = clubs; 
     return new ShapeResult(this, shape); 

这将返回一个形状与属性俱乐部这是你对你的驱动程序定义的形状列表。请注意,您必须为ClubList创建一个视图。在你的形状ClubList您可以通过显示你的球杆形状:

@foreach (var club in Model.Clubs) { 
        @Display(club) 
      } 
+0

我尝试了上述解决方案,但它不带记录的内容类型。我修改了正在工作的原始帖子,但问题是我必须指定内容部分而不是内容类型。我的内容类型是“课程”,内容部分是“课程” –

+0

您必须指定ForType(“课程”)。顺便说一句,您只需输入course.ContentItem即可访问这些ContentType。但是,如果要为每个零件构建整个形状,则应调用BuildDisplay方法,该方法接受ContentItem。 – jmgomez