Orchard CMS で新しいウィジェットを作成しています。これを行う方法は、最初にルートとコントローラーを追加し、ルートで定義された URL でコードを実行して機能を試すことです。たとえば、http://localhost:30320/Index
My Routes.cs が設定されているため、この要求が指定されたコントローラーにルーティングされます。画面上で起こっています。これはすべて非常にうまく機能します。
結果に満足したので、これらすべてを新しいウィジェットに配置してみました。このために、ウィジェットを設定する新しい Migrations クラスを作成しました。これはかなり簡単で、これでウィジェットがホームページ レイヤーに追加されました。
私が遭遇しているのは、コントローラーがもう実行されていないことです。コントローラーを実行するように指定するルートを設定していないので、それほど奇妙ではありません。ビューが引き続き必要な情報を取得できるように、Controller ロジックを Driver メソッドに移動する必要があるのでしょうか。
現時点で持っているドライバーは次のようになります。
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;
}
これは非常にうまく機能しますが、私には「ハッキング」のように感じます...