按ID加载Ektron小部件?

按ID加载Ektron小部件?,ektron,Ektron,我正在寻求帮助解决Ektron问题 场景是,我们有许多小部件,它们位于许多页面上。这些小部件都接受用户输入。当用户在填写表单的页面中移动时,我们将其字段响应保存到会话状态对象中,这些响应稍后会写入数据库。 当用户到达表单末尾时,我们希望以只读模式显示他们填写的所有小部件。这将用作摘要页面 我们可以通过查询字符串参数或CMS可编辑字段轻松地将小部件上的每个输入控件设置为只读。我们还可以将用户响应从会话状态加载回小部件 我们遇到的问题是将CMS编辑的内容加载回小部件 有没有一种方法可以重新加载以前查

我正在寻求帮助解决Ektron问题

场景是,我们有许多小部件,它们位于许多页面上。这些小部件都接受用户输入。当用户在填写表单的页面中移动时,我们将其字段响应保存到会话状态对象中,这些响应稍后会写入数据库。 当用户到达表单末尾时,我们希望以只读模式显示他们填写的所有小部件。这将用作摘要页面

我们可以通过查询字符串参数或CMS可编辑字段轻松地将小部件上的每个输入控件设置为只读。我们还可以将用户响应从会话状态加载回小部件

我们遇到的问题是将CMS编辑的内容加载回小部件

有没有一种方法可以重新加载以前查看过的小部件?也许是通过使用Ektron API的id


我们已经使用了WidgetBase.Host对象,但无法使其正常工作。我们还尝试将整个widget对象保存到会话状态并重新加载到另一个页面上,但这也不起作用。

您提出了一个有趣的情况。最后,我不确定我是否会使用PageBuilder。如果您可以存储每个小部件控制文件(.ascx)的路径,那么我将在最后有一个.aspx页面,它将每个小部件作为控件加载

为了做到这一点,您可能需要稍微修改小部件,基本上是在使用前验证_host是否为null。像这样:

_host = Ektron.Cms.Widget.WidgetHost.GetHost(this);
if (_host != null)
{
    _host.Title = "Widget Name";
    _host.Edit += new EditDelegate(EditEvent);
    _host.Maximize += new MaximizeDelegate(delegate() { Visible = true; });
    _host.Minimize += new MinimizeDelegate(delegate() { Visible = false; });
    _host.Create += new CreateDelegate(delegate() { EditEvent(""); });
}
这应该允许您将小部件用作标准的.NET控件,可以在适当的时候动态添加到页面中

除非有理由让pagebuilder UI继续加载这些内容,否则我将采用这种方式。

在您的代码中,
使用Ektron.Cms.PageBuilder
使用Ektron.Cms.Widget

// The CMS Content ID of the first page of your form. 
const long otherPageId = 1036;

PageModel pm = new PageModel();
PageData pd = null;
pm.Get(otherPageId, out pd, false);
foreach (Ektron.Cms.PageBuilder.WidgetData w in pd.Widgets)
{

    WidgetTypeData myWidgetType;
    IWidgetTypeModel typeModel = Ektron.Cms.Widget.WidgetTypeFactory.GetModel();
    typeModel.FindByControlURL(w.ControlURL, out myWidgetType);

    // you may have to prefix the ControlURL with "/Widgets/" + w.ControlURL
    UserControl myWidget = Page.LoadControl(w.ControlURL) as UserControl;

    // _host is your page's widget host controller. 
    _host.PopulateWidgetProperties(ref myWidget, ref myWidgetType, w.Settings);
}
现在,您可以将
myWidget
添加到页面中。

如果要读取其属性。首先,您需要小部件的类型。在您的ASPX页面中,您可以使用
,然后在代码旁边的文件中,您可以将控件的类型引用为
widgets\u YourWidget
。您可以键入cast myWidget作为
widgets\u YourWidget

谢谢您的回复。是否有任何方法可以覆盖WidgetHost.GetHost以从另一个页面的该版本而不是当前页面检索小部件的属性?我们有一个表单,其中包含多个小部件,内容编辑器可以修改显示给最终用户的问题文本。在表单的末尾,我们希望有一个摘要页面,该页面将显示编辑和用户输入的确切文本。如果我们只是将小部件放在摘要页面模板上,它们将使用我们为这些属性指定的默认文本。我们希望加载上一个主机,这样我们可以确保最终用户看到完全相同的问题文本,而无需让内容编辑器复制两次字段(每页一次)。谢谢您,这非常有帮助。我的主机是IWidgetHost类型。示例的最后一行无法编译,因为它说。。。错误1“Ektron.Cms.Widget.IWidgetHost”不包含“PopulateWidgetProperties”的定义,并且没有扩展方法“PopulateWidgetProperties”。上面的代码以Ektron的CMS400版本8.5为目标。对于旧版本,可以使用
IWidgetModel model=Ektron.Cms.Widget.WidgetFactory.GetModel();PopulateWidgetProperties(ref myWidget,ref myWidgetType,w.settings)