1

我正在寻找有关 Ektron 问题的帮助。

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

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

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

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

我们已经使用了 WidgetBase.Host 对象,但无法使其工作。我们还尝试将整个小部件对象保存到会话状态并将其重新加载到另一个页面,但这也没有奏效。

4

2 回答 2

2

在您的代码中,
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" %> Then 在您的代码旁文件中,您可以将控件的类型引用为widgets_YourWidget. 您可以键入 cast myWidget 为widgets_YourWidget

于 2012-09-27T19:41:12.093 回答
1

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

为此,您可能需要稍微修改小部件,本质上是在使用之前验证 _host 不为空。像这样:

_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 一起加载,否则我会采取这种方式。

于 2012-09-26T13:58:07.790 回答