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