同一个人如何多次发送表单功能?如果未选中XForm编辑器中的此字段,则用户只能提交一次表单。
我认为对于匿名用户来说,它基于cookie,但我看不到任何相关的cookie通过网络传输。查看ILSpy中的EPiServer.XForms.XFormData.HasAlreadyPosted(Page page)
表明,如果persistance选项未设置为Database或UserName为null,则它实际上会检查cookie。
在这种情况下,它会检查名为“FormCookie”的cookie:
private static bool CheckCookieForPostedForm(Guid formId, Page page)
{
HttpCookie httpCookie = page.Request.Cookies["FormCookie"];
if (httpCookie != null)
{
foreach (string text in httpCookie.Values.Keys)
{
if (text.Equals(formId.ToString()))
{
return true;
}
}
return false;
}
return false;
}
我正在以匿名用户身份进行测试,但是在表单的POST或者感谢页面上的请求或响应的请求或响应中没有“FormCookie”,所以我看不出它是如何工作的
遵循匿名用户的逻辑,如果您要发布到数据库并且UserName不为null,则会有一个Linq查询,它会检查DDS以查找具有匹配的FormId和UserName的提交。
public bool HasAlreadyPosted(Page page)
{
if ((this.ChannelOptions & ChannelOptions.Database) != ChannelOptions.Database
|| this.UserName == null)
{
return XFormData.CheckCookieForPostedForm(this.FormId, page);
}
if (Guid.Empty.Equals(this.FormId))
{
throw new InvalidOperationException(
"Cannot read the XFormData before the FormName property has been set");
}
DynamicDataStore store = XFormData.GetStore(this.FormId);
int num = (from post in store.ItemsAsPropertyBag()
where (Guid)post["Meta_FormId"] == this.FormId &&
(string)post["Meta_UserName"] == this.UserName
select post).Count<PropertyBag>();
return num > 0;
}
查看数据库(tblXFormData),UserName列中没有NULL
个值。可能是上面的this.UserName == null
检查失败了,然后它正在执行Linq查询,该查询将匿名用户的用户名与表中的用户名进行比较,其中第一个匿名用户中有一个空的用户名和报告误报?
答案 0 :(得分:1)
我能够做的是在OnInit方法中使用AfterSubmitPostedData事件然后在处理程序中使用方法SetPostedCookie。然后,这将创建您的帖子中描述的FormCookie cookie。
api文档不是最好的。
public void FormControl_AfterSubmitPostedData(object sender, SaveFormDataEventArgs e)
{
this.ShowStats();
// we do this in the case of an anonymous user votes on the site.
XFormData xfd = this.FormControl.FormDefinition.CreateFormData();
xfd.SetPostedCookie(xfd.FormId, Page);
}