Orchardcms 如何在Orchard 1.9中创建布局元素

Orchardcms 如何在Orchard 1.9中创建布局元素,orchardcms,Orchardcms,有人可以指导我如何在Orchard 1.9中创建布局元素吗。我在网上找不到任何资源。一般来说,创建新布局元素类似于创建新零件。在这个过程中有一个驱动程序和一些视图。切中要害-您需要按照以下方式实施: 元素类。。从包含所有元素数据的元素继承的类。可以说是一个模型 驱动程序。从ElementDriver继承的类,其中TElement是您在上面创建的类型。每个元素都有自己的驱动程序,用于处理显示管理编辑器(以及回发)和前端显示视图 形状。按照惯例,所有形状都应放在/Views/Elements/文件

有人可以指导我如何在Orchard 1.9中创建布局元素吗。我在网上找不到任何资源。

一般来说,创建新布局元素类似于创建新零件。在这个过程中有一个驱动程序和一些视图。切中要害-您需要按照以下方式实施:

  • 元素类。。从包含所有元素数据的
    元素继承的类。可以说是一个模型
  • 驱动程序。
    ElementDriver
    继承的类,其中
    TElement
    是您在上面创建的类型。每个元素都有自己的驱动程序,用于处理显示管理编辑器(以及回发)和前端显示视图
  • 形状。按照惯例,所有形状都应放在/Views/Elements/文件夹下

    • 显示形状。以您的元素命名,即
      MyElement.cshtml
      。这一个在前端呈现您的元素
    • 设计显示形状。。以您的元素命名,带有
      .Design
      后缀,即
      MyElement.Design.cshtml
      。这一个在布局编辑器中呈现您的元素
    • 编辑器形状。。这个应该放在/Views/EditorTemplates/文件夹中。默认命名约定为
      Elements.MyElement.cshtml
      。当您在布局编辑器画布上放置新元素时,它会呈现所显示的编辑器
完成以上操作后,新元素应显示在布局编辑器右侧的元素列表中,可以使用


如果您想执行一些更复杂的元素,请检查现有的实现。Layouts模块有一个非常好的架构,所以你们应该很快就能跟上速度。请记住我上面写的必要步骤。

要创建自定义布局元素,首先创建一个继承自
元素的类
Element
位于
Orchard.Layouts
命名空间中,因此需要添加引用。要遵循Orchard标准,请将此文件放在名为“元素”的文件夹中

public class MyElement : Element
{
    public override string Category
    {
        get { return "Content"; }
    }

    public string MyCustomProperty
    {
        get { return this.Retrieve(x => x.MyCustomProperty); }
        set { this.Store(x => x.MyCustomProperty, value); }
    }
}
接下来,在名为Drivers的文件夹中创建一个driver类。此类继承自
ElementDriver
,您可能希望覆盖
OnBuildEditor
ondisplay
方法
OnBuildEditor
用于在保存编辑器时创建编辑器形状和更新数据库<当我们需要在显示元素时执行操作时,使用code>ondisplay
。通常,您需要向形状添加属性,这可以通过
context.ElementShape.MyAdditionalProperty=“My Value”完成

公共类MyElementDriver:ElementDriver
{
受保护的重写EditorResult OnBuildEditor(MyElement元素、ElementEditorContext上下文)
{
var viewModel=新的MyElementEditorViewModel
{
MyCustomProperty=element.MyCustomProperty
};
var editor=context.ShapeFactory.EditorTemplate(TemplateName:“Elements.MyElement”,Model:viewModel);
if(context.Updater!=null)
{
context.Updater.TryUpdateModel(viewModel,context.Prefix,null,null);
element.MyCustomProperty=viewModel.MyCustomProperty;
}
返回编辑器(上下文、编辑器);
}
受保护的覆盖无效显示(Reddit元素、ElementDisplayContext上下文)
{
context.ElementShape.MyAdditionalProperty=“我的值”;
}
}
然后我们只需要我们的观点。我们的编辑器视图进入视图/编辑器模板。文件名必须是我们设置的编辑器形状的模板名。在本例中,视图名称为Elements.MyElement.cshtml

@model MyNameSpace.ViewModels.MyElementEditorViewModel

<fieldset>
    <div>
        @Html.LabelFor(m => m.MyCustomProperty, T("My Custom Property"))
        @Html.TextBoxFor(m => m.MyCustomProperty, new { @class = "text medium" })
    </div>
</fieldset>
@using MyNameSpace.Elements
@using MyNameSpace.Models

@{
    var element = (MyElement)Model.Element;
}

<h1>@element.MyCustomProperty</h1>
@model MyNameSpace.ViewModels.MyElementEditorViewModel
@LabelFor(m=>m.MyCustomProperty,T(“我的自定义属性”))
@TextBoxFor(m=>m.MyCustomProperty,新的{@class=“text medium”})
最后,我们只需要前端的一个视图。此视图进入以下文件夹视图/元素。视图文件的名称与我们的元素类名相同。对于本例,该文件将被称为MyElement.cshtml

@model MyNameSpace.ViewModels.MyElementEditorViewModel

<fieldset>
    <div>
        @Html.LabelFor(m => m.MyCustomProperty, T("My Custom Property"))
        @Html.TextBoxFor(m => m.MyCustomProperty, new { @class = "text medium" })
    </div>
</fieldset>
@using MyNameSpace.Elements
@using MyNameSpace.Models

@{
    var element = (MyElement)Model.Element;
}

<h1>@element.MyCustomProperty</h1>
使用MyNameSpace.Elements的
@
@使用MyNameSpace.Models
@{
var元素=(MyElement)Model.element;
}
@element.MyCustomProperty
然后,您将拥有一个新元素,可以使用布局编辑器将其拖动到布局中


有关从头到尾创建元素的详细信息,请查看我的博客文章。

查看此博客我已经查看了本文。这是不完整的。请更具体一些。它缺少什么?所以您不需要创建模块?链接的博客文章从创建模块开始。我跳过了创建一个模块,但我并没有在布局工具箱中看到它。如果没有创建模块,您将代码放在哪里?在已经存在的模块中?模块/功能是否已启用?代码是否编译?如果我没记错的话,驱动程序中的一个参数的一个类名被更改了(应该很明显是哪一个,这是一个很容易修复的问题)。日志中有错误吗?我已经把它添加到了主题中,我想这是一个模块。我的问题是,解决方案中没有包含主题,因此没有编译添加的文件。像这样使用codegen重新添加主题修复了它:codegen主题ThemeNameHere/CreateProject:true/IncludeSolution:true