Validation 如何在EPiServer Xforms中实现单一提交?

Validation 如何在EPiServer Xforms中实现单一提交?,validation,xforms,episerver,Validation,Xforms,Episerver,同一个人如何能够多次发送表单?如果未选中XForm编辑器中的此字段,则用户只能提交表单一次 我认为对于匿名用户来说,这是基于cookie的,但我看不到任何相关的cookie通过网络传播。查看ILSpy中的EPiServer.XForms.XFormData.HasAlreadyPosted(第页)可以看出,如果持久性选项未设置为数据库或用户名为null,它实际上会检查cookie 在这种情况下,它会检查名为“FormCookie”的cookie: 我以匿名用户的身份进行测试,但表单帖子上的请求或

同一个人如何能够多次发送表单?如果未选中XForm编辑器中的此字段,则用户只能提交表单一次

我认为对于匿名用户来说,这是基于cookie的,但我看不到任何相关的cookie通过网络传播。查看ILSpy中的
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);
}