2011-11-30 2 views
0

같은 사람이 양식을 여러 번 보낼 수 기능을 구현 했습니까? XForm 편집기의이 필드를 선택 취소하면 사용자는 양식을 한 번만 제출할 수 있습니다.EPiServer Xforms에서 단일 제출이 어떻게 구현됩니까?

익명 사용자는 쿠키를 기반으로 생각했지만 관련 쿠키는 전선을 통해 볼 수 없습니다. ILSpy에서 EPiServer.XForms.XFormData.HasAlreadyPosted(Page page)을 보면 영구 옵션이 데이터베이스로 설정되어 있지 않거나 UserName이 null 인 경우 실제로 쿠키를 확인합니다. 그것은 "FormCookie"라는 이름의 쿠키에 대한 확인이 상황에서

:

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이 아닌 경우 일치하는 FormId 및 UserName을 가진 제출을 DDS에서 확인하는 Linq 쿼리가 있습니다. 데이터베이스 (tblXFormData)에서 찾고

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; 
} 

, 사용자 이름 열에 더 NULL 값이 없습니다. 위의 this.UserName == null 검사가 실패한 경우 익명 사용자의 사용자 이름을 테이블의 사용자 이름과 비교하는 첫 번째 익명 사용자의 빈 사용자 이름과 거짓 긍정을보고있는 Linq 쿼리를 실행하고 있습니까?

답변

1

OnInit 메서드에서 AfterSubmitPostedData 이벤트를 사용하여 처리기에서 SetPostedCookie 메서드를 사용할 수있었습니다. 그러면 게시물에 설명 된대로 FormCookie 쿠키가 만들어집니다.

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