我正在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;
}
虽然这种方法效果很好,但感觉就像'黑客'一样......
答案 0 :(得分:0)
当您想要接管内容区域中显示的所有内容时使用控制器,但返回形状结果,以便主题,窗口小部件等仍然可以插入。这就是您的控制器无法执行的操作。