在Orchard CMS中按内容类型过滤

时间:2013-12-16 09:14:08

标签: orchardcms orchardcms-1.7

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

    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);
    }

1 个答案:

答案 0 :(得分: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);

这将返回一个包含属性Clubs的形状,这是您在Drivers上定义的形状列表。请注意,您必须为ClubList创建一个视图。在您的形状ClubList中,您可以通过以下方式显示您的球杆形状:

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