我正在尝试在主站点主页(〜/)中呈现模块中定义的视图,因为它是主要内容。如果用户未经过身份验证,我需要显示登录/注册视图。
登录视图位于一个模块(产品模块)中,登录/注册视图位于另一个模块(帐户模块)中。登录视图需要服务调用才能根据用户的产品获取数据。我目前正在使用标准的mvc渲染这些视图并在其控制器中获取所需的数据。
这可以通过将这些视图视为形状模板来实现吗?如果是这样,有没有像这样的主页浏览视图的例子?或者有更好的方法来实现这一目标吗?
我已尝试将IHomePageProvider命名为在Product模块中返回我自己的主页ViewResult,但没有任何成功。
干杯。
答案 0 :(得分:3)
首先,您可能希望查看窗口小部件和图层。您可以为已验证用户定义一个图层,为匿名用户定义一个图层,并将窗口小部件附加到这些图层以实现您想要的效果。这可能是您完成此任务的最佳方式。在Orchard文档中查看有关如何执行此操作的示例。
在使用自定义控制器和大量自定义逻辑之前,我做过类似的事情。由于我的具体要求,小部件和图层不适用于此。页面上的所有内容都需要根据某些输入进行更改,并且窗口小部件和图层不太适合这种情况。我所做的是创建一个自定义控制器和一个具有高优先级的相应Route(因此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)