Validation 如何在EPiServer Xforms中实现单一提交?
同一个人如何能够多次发送表单?如果未选中XForm编辑器中的此字段,则用户只能提交表单一次 我认为对于匿名用户来说,这是基于cookie的,但我看不到任何相关的cookie通过网络传播。查看ILSpy中的Validation 如何在EPiServer Xforms中实现单一提交?,validation,xforms,episerver,Validation,Xforms,Episerver,同一个人如何能够多次发送表单?如果未选中XForm编辑器中的此字段,则用户只能提交表单一次 我认为对于匿名用户来说,这是基于cookie的,但我看不到任何相关的cookie通过网络传播。查看ILSpy中的EPiServer.XForms.XFormData.HasAlreadyPosted(第页)可以看出,如果持久性选项未设置为数据库或用户名为null,它实际上会检查cookie 在这种情况下,它会检查名为“FormCookie”的cookie: 我以匿名用户的身份进行测试,但表单帖子上的请求或
EPiServer.XForms.XFormData.HasAlreadyPosted(第页)
可以看出,如果持久性选项未设置为数据库或用户名为null,它实际上会检查cookie
在这种情况下,它会检查名为“FormCookie”的cookie:
我以匿名用户的身份进行测试,但表单帖子上的请求或响应或感谢页面上的请求或响应中没有“FormCookie”,因此我看不出这是如何工作的
按照匿名用户的逻辑,如果您正在发布到数据库,并且用户名不为null,则会有一个Linq查询,用于检查DDS是否提交了具有匹配FormId和用户名的提交
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;
}
public bool已经发布(第页)
{
if((this.ChannelOptions&ChannelOptions.Database)!=ChannelOptions.Database
||this.UserName==null)
{
返回XFormData.CheckCookieForPostedForm(this.FormId,第页);
}
if(Guid.Empty.Equals(this.FormId))
{
抛出新的InvalidOperationException(
“在设置FormName属性之前无法读取XFormData”);
}
DynamicDataStore=XFormData.GetStore(this.FormId);
int num=(来自post-in-store.ItemsAsPropertyBag()中)
其中(Guid)post[“Meta_FormId”]==this.FormId&&
(字符串)post[“Meta_UserName”]==this.UserName
选择post.Count();
返回num>0;
}
查看数据库(tblXFormData),用户名列中没有
NULL
值。可能是上面的this.UserName==null
检查失败了,然后它正在执行Linq查询,将匿名用户的用户名与表中的用户名进行比较,其中第一个匿名用户有一个空的,并且报告了一个假阳性?我能做的是在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);
}
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);
}