在某种情况下,我需要以编程方式更改表单呈现器中显示的WFFM表单。表单渲染器本身通过演示详细信息添加到占位符。
我可以访问Form Render并设置FormID并将其参数更新为我想要显示的Form的ID。然而,就好像Sitecore不尊重这些属性并显示原始形式,即使我在页面生命周期的早期移动我的代码,例如Page_Init。我的代码如下
// Pass in controls of the sublayout
public FormRender SetFormRender(Control control, string dataSource)
{
FormRender formRender = null;
// loop through controls contained in passed in control
foreach (Control child in control.Controls)
{
if (child is FormRender)
{
formRender = child as FormRender;
if (formRender != null)
{
formRender.FormID = dataSource;
formRender.Parameters = "FormID=" + HttpUtility.HtmlEncode(dataSource);
break;
}
}
// If control has controls pass to this method for recursion
if (control.HasControls())
{
var nestedFormRender = SetFormRender(child, dataSource);
if (nestedFormRender != null && formRender == null)
{
formRender = nestedFormRender;
break;
}
}
}
return formRender;
}
答案 0 :(得分:4)
也许在设置FormID和参数后,您需要调用FormRender.OnInit(),所以您的代码可能是这样的:
....
formRender.FormID = dataSource;
formRender.Parameters = "FormID=" + HttpUtility.HtmlEncode(dataSource);
formRender.OnInit(null);
break;
....
修改强>
我不认为您可以从代码中调用formRender.OnInit()作为其受保护的方法,但您可以做的是创建一个新的控件来继承FormRender并用此替换演示详细信息上的控件,并且然后重写OnInit()方法并放置处理FormID属性的代码,然后调用base.OnInit()
Mike Reynolds有一篇关于如何根据查询字符串here
加载不同表单的博客答案 1 :(得分:2)
我找到了一个基于Mike Reynolds blog的解决方案,因为艾哈迈德奥库建议让我50%的路上但需要额外的工作。
我创建了一个新的FormRender,它公开了要传递的覆盖表单ID的公共属性。这个新的FormRender实现了现有的一个,但是覆盖基础OnInit()仍然会产生一个受保护的方法,这意味着它在我们需要它时无法被调用。因此,我创建了一个非重写的公共OnInit()方法:
public class PublicFormRender : FormRender
{
public string OverridingFormId { get; set; }
public void OnInit()
{
OnInit(new EventArgs());
}
protected override void OnInit(System.EventArgs e)
{
// New logic added here so overriding Id is always honoured
// especially in the case of PublicFormRender is added via the FrontEnd
if (!string.IsNullOrEmpty(OverridingFormId))
{
FormID = OverridingFormId;
var parameters = WebUtil.ParseUrlParameters(Parameters);
if (parameters["FormID"] != null)
parameters["FormID"] = HttpUtility.HtmlEncode(OverridingFormId);
Parameters = parameters.ToString();
}
base.OnInit(e);
}
}
我在路径/sitecore/layout/Renderings/Modules/Web Forms for Marketers/
中复制Sitecore中的FormRender,引用PublicFormRender
并使用它在演示文稿详细信息中添加表单
public PublicIdFormRender SetFormRender(Control control, string dataSource)
{
PublicIdFormRender formRender = null;
// Loop through to find the new PublicFormRender
foreach (Control child in control.Controls)
{
var publicFormRender = child as PublicFormRender;
if (publicFormRender != null)
{
// Set the new public property to the data source
publicFormRender.OverridingFormId = dataSource;
// Initialise the Form via the non-overriding public method
publicFormRender.OnInit();
formRender = publicFormRender;
break;
}
if (control.HasControls())
{
var nestedFormRender = SetFormRender(child, dataSource);
if (nestedFormRender != null && formRender == null)
{
formRender = nestedFormRender;
break;
}
}
}
return formRender;
}
答案 2 :(得分:0)
这是因为表单在添加到控件集合时实际呈现。如果您必须遵守此架构,我的建议是从集合中删除控件,然后通过
添加它control.Controls.Add(formRender);
效率不高,但应该有效。