0

同一个人如何实现多次发送表单的功能?当 XForm 编辑器中的该字段未选中时,用户只能提交一次表单。

我以为匿名用户是基于 cookie 的,但我看不到任何相关的 cookie 通过网络传输。在EPiServer.XForms.XFormData.HasAlreadyPosted(Page page)ILSpy 中查看表明,如果持久性选项未设置为 Database 或 UserName 为空,它实际上会检查 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 不为空,则会有一个 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 查询,将匿名用户的用户名与表中的用户名进行比较,其中第一个匿名用户的用户名是空的并报告误报?

4

1 回答 1

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);
}
于 2012-05-29T12:41:35.397 回答