0

我正在尝试在主站点主页(〜/)中呈现在模块中定义的视图,因为它是主要内容。如果用户未通过身份验证,我需要显示登录/注册视图。

登录视图位于一个模块(产品模块)中,登录/注册视图位于另一个模块(帐户模块)中。登录视图需要一个服务调用来获取基于用户产品的数据。我目前正在使用标准 mvc 来呈现这些视图并在其控制器中获取它们所需的数据。

这可以通过将这些视图视为形状模板来实现吗?如果是这样,有没有像这样将视图拉到主页的例子?还是有更好的方法来实现这一目标?

我尝试实现 IHomePageProvider 以在 Product 模块中返回我自己的主页 ViewResult,但没有任何成功。

干杯。

4

1 回答 1

3

首先,您可能想要查看小部件和图层。您可以为经过身份验证的用户定义一个层,为匿名用户定义一个层,并将小部件附加到这些层以实现您想要的。这可能是您完成此任务的最佳方式。查看 Orchard 文档以获取有关如何执行此操作的示例。

在使用自定义控制器和大量自定义逻辑之前,我做过类似的事情。由于我的特定要求,小部件和图层不适用于此。页面上的所有内容都需要根据某些输入进行更改,而小部件和图层将不太适合此操作。我所做的是创建一个自定义控制器,以及一个具有高优先级的相应 Route(因此 Route 优先于任何其他想要成为主页的人)。我根本没有弄乱 IHomePageProvider 。

在控制器操作中,我提取了必要的数据,并创建了我想要的形状,然后返回如下结果:return new ShapeResult(this, homePageShape);

homePageShape在 return 语句之前是这样构造的:

        // Create personalized home page shape: 
        var homeShape = _orchardServices.New.CustomHome(
            SomeShape1: someShape1
            , SomeShape2: someShape2
            , SomeModel1: someModel1
            ...
        );

这将创建一个名为 CustomHome 的形状,并且 orchard 将自动在模块的 views 文件夹中查找名为 CustomHome.cshtml 的模板。

我创建了几个形状(您在上面看到的所有“someShapeX”变量)。大多数情况下,它们是通过 BuildDisplay() 方法从内容部分创建的。使用 IContentManager 查询内容部分,并像这样创建形状(此示例用于幻灯片放映形状):

        dynamic sliderShape = _contentManager.BuildDisplay(sliderPart, "Detail");

您可以将逻辑放入控制器中,以根据用户是否登录来构建所需的形状。在 CustomHome.cshtml 中,您将呈现如下形状:

        @Display(Model.SomeShape1)
于 2012-05-02T17:03:37.527 回答