2011-11-30 27 views
0

功能是否可以同時發送多次?當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查詢,它將匿名用戶的用戶名與表中的用戶名進行比較,其中第一個匿名用戶有一個空的用戶名並報告誤報?

回答

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); 
} 
相關問題