Orchard的驱动程序和控制器有点相同吗?

时间:2012-05-17 12:03:22

标签: asp.net-mvc naming-conventions orchardcms

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

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

我遇到的是控制器不再执行了。不是很奇怪,因为我没有设置任何指定Controller应该执行的路由。我想知道,我应该将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。如果我在文件中放入一些静态文本,我可以看到正在正确呈现此视图。

那么,我应该将Controller逻辑移动到Driver,还是我忘记了设置中的某些内容?

注意:我已经安装了位置,模块,迁移和处理程序。

修改: 如果我使用此代码,一切都运行良好:

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

虽然这种方法效果很好,但感觉就像'黑客'一样......

1 个答案:

答案 0 :(得分:0)

当您想要接管内容区域中显示的所有内容时使用控制器,但返回形状结果,以便主题,窗口小部件等仍然可以插入。这就是您的控制器无法执行的操作。