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

时间:2011-11-30 11:19:01

标签: validation xforms episerver

同一个人如何多次发送表单功能?如果未选中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查询,该查询将匿名用户的用户名与表中的用户名进行比较,其中第一个匿名用户中有一个空的用户名和报告误报?

1 个答案:

答案 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);
}