功能是否可以同時發送多次?當XForm編輯器中的此字段未選中時,用戶只能提交一次該表單。如何在EPiServer Xforms中實現單一提交?
我以爲匿名用戶是基於cookie,但我看不到任何相關的cookies通過電線。在ILSpy中查看EPiServer.XForms.XFormData.HasAlreadyPosted(Page page)
表明,如果持久性選項未設置爲數據庫或用戶名爲空,它實際上會檢查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;
}
我測試作爲匿名用戶,但沒有「FormCookie」出現在上的的POST請求或響應表單或者謝謝頁面上的請求或回覆,所以我看不到這是如何工作的。
遵循匿名用戶的邏輯,如果您發佈到數據庫並且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查詢,它將匿名用戶的用戶名與表中的用戶名進行比較,其中第一個匿名用戶有一個空的用戶名並報告誤報?