我正在寻找Ektron问题的一些帮助。
场景是我们有许多小部件,它们位于许多页面上。这些小部件都需要用户输入。当用户在填写表单的页面中移动时,我们将其字段响应保存到会话状态对象中,稍后这些将被写入数据库。 当用户到达表单的末尾时,我们希望以只读模式显示他们填写的所有小部件。这将作为摘要页面。
我们可以通过查询字符串参数或CMS可编辑字段轻松地将窗口小部件上的每个输入控件设置为只读。我们还可以从会话状态将用户响应加载回窗口小部件。
我们遇到的问题是将CMS编辑的内容加载回窗口小部件。
有没有办法可以重新加载以前查看过的小部件?也许是使用Ektron API的id?
我们已经使用了WidgetBase.Host对象但是无法使其工作。我们还尝试将整个窗口小部件对象保存到会话状态并将其重新加载到另一个页面上,但这也没有用。
答案 0 :(得分: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" %>
然后在您的代码旁边文件中,您可以将控件的类型引用为widgets_YourWidget
。您可以将cast myWidget键入widgets_YourWidget
答案 1 :(得分: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控件,可以在适当的时候动态添加到页面中。
除非有理由继续使用pagebuilder UI加载这些内容,否则这就是我要采用的路线。