-1

我正在 Orchard CMS 中创建一个新的小部件。我这样做的方法是首先添加一个 Route 和 Controller,然后通过在 Route 中定义的 url 上运行代码来尝试该功能,例如http://localhost:30320/Index My Routes.cs 已设置,因此它将这个请求路由到指定的控制器和东西是发生在屏幕上。这一切都很好。

现在我对结果感到满意,我尝试将所有这些都放在一个新的小部件中。为此,我创建了新的 Migrations 类来设置小部件。这相当简单,现在小部件已添加到主页层。

我遇到的事情是控制器不再执行。不是很奇怪,因为我没有设置任何指定控制器应该执行的路由。我想知道,我是否应该将 Controller 逻辑移动到 Driver 方法,以便 View 仍然可以获得必要的信息?

我现在拥有的驱动程序如下所示:

public class FrontpageDrivers : ContentPartDriver<FrontpageModelPart>
{
    protected override DriverResult Display(FrontpageModelPart part, string displayType, dynamic shapeHelper)
    {
        //return base.Display(part, displayType, shapeHelper);
        if (displayType.StartsWith("Detail"))
            return ContentShape("Parts_Index", () => shapeHelper.Parts_Index(
                                                                    LatestPostCollection: part.LatestPostCollection,
                                                                    TopRatedPostCollection: part.TopRatedPostCollection,
                                                                    TotalMonthCollection: part.TotalMonthCollection,
                                                                    ContentPart: part
                                                                    ));
        return null;
    }
}

需要执行的 PartsController 方法如下所示:

[HttpGet]
public ActionResult Detail()
{
    //Do something to get blogposts
    var getter = new GetBlogPost(_blogService, _blogPostService, _votingService);
    getter.Initialize();

    var latestPosts = getter.GetLatestPosts();
    var highestRankedPosts = getter.GetHighestRankedPosts();
    var archiveData = getter.GetTotalPostsPerMonth();

    var viewModel = new FrontpageModelPart();
    viewModel.LatestPostCollection = latestPosts;
    viewModel.TopRatedPostCollection = highestRankedPosts;
    viewModel.TotalMonthCollection = archiveData;

    return View("Index", viewModel);
}

我尝试将方法重命名为 Index 和 Detail,两者都不起作用。显示的视图是/Views/Parts/Index.cshtml。如果我在文件中放入一些静态文本,我可以看到这个视图正在正确呈现。

那么,我应该将控制器逻辑移动到驱动程序,还是我忘记了设置中的某些内容?

注意:我已经准备好放置、模块、迁移和处理程序。

编辑:如果我使用这段代码,一切都很好:

protected override DriverResult Display(FrontpageModelPart part, string displayType, dynamic shapeHelper)
{
    var controller = new PartsController(Services, _blogService, _blogPostService, _votingService);
    part = controller.GetIndexViewModel();

    if (displayType.StartsWith("Detail"))
        return ContentShape("Parts_Index", () => shapeHelper.Parts_Index(
                                                                LatestPostCollection: part.LatestPostCollection,
                                                                TopRatedPostCollection: part.TopRatedPostCollection,
                                                                TotalMonthCollection: part.TotalMonthCollection,
                                                                ContentPart: part
                                                                ));
    return null;
}

尽管这工作得很好,但对我来说就像是“黑客”......

4

1 回答 1

0

当您想要接管出现在内容区域中的所有内容时使用控制器,但返回一个形状结果,以便主题、小部件等仍然可以加入。这就是您的控制器无法做到的。

于 2012-05-17T18:49:19.990 回答