按ID加载Ektron小部件



我正在寻求一些关于Ektron问题的帮助。

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

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

我们遇到的问题是将CMS编辑的内容重新加载到小部件中。

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

我们玩过WidgetBase。Host对象,但无法使其工作。我们还尝试将整个小部件对象保存到会话状态,并将其重新加载到另一个页面上,但这也不起作用。

在您的代码中,
using Ektron.Cms.PageBuilder;
using 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页面中,可以使用<%@ Reference Control="~/widgets/YourWidget.ascx" %>。然后在代码旁边的文件中,可以将控件的类型引用为widgets_YourWidget。您可以键入cast myWidget作为widgets_YourWidget

您提出了一个有趣的情况。最后,我不确定我是否会使用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控件,可以在适当的时候动态添加到页面中。

除非有理由让这些页面一直加载到页面生成器UI中,否则我会采取这种方式。

最新更新