【问题标题】:Load Ektron widget by ID?按 ID 加载 Ektron 小部件?
【发布时间】:2012-09-16 18:08:29
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: ektron


    【解决方案1】:

    在您的代码中,
    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 as widgets_YourWidget

    【讨论】:

    • 谢谢你,它非常有帮助。我的主机是 IWidgetHost 类型。您的示例的最后一行不会像它所说的那样编译...错误 1 ​​'Ektron.Cms.Widget.IWidgetHost' 不包含 'PopulateWidgetProperties' 的定义并且没有扩展方法 'PopulateWidgetProperties'
    • 以上代码针对 Ektron 的 CMS400 8.5 版。对于旧版本,您可以使用IWidgetModel model = Ektron.Cms.Widget.WidgetFactory.GetModel(); model.PopulateWidgetProperties(ref myWidget, ref myWidgetType, w.settings);
    【解决方案2】:

    你提出了一个有趣的情况。最后,我不确定我是否会使用 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 加载这些内容,否则我会采取这种方式。

    【讨论】:

    • 感谢您的回复。有什么方法可以覆盖 WidgetHost.GetHost 以从另一个页面的那个版本而不是当前页面检索小部件的属性?
    • 我们有一个包含多个小部件的表单,内容编辑器可以在其中修改显示给最终用户的问题文本。在表单的末尾,我们想要一个摘要页面,它将显示编辑器和用户输入的确切文本。如果我们只是将小部件放在摘要页面模板上,它们将使用我们为这些属性分配的任何默认文本。我们想加载以前的主机,这样我们就可以确保最终用户看到完全相同的问题文本,而无需让内容编辑器复制字段两次(每页一次)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多