0

同じ人がフォームを複数回送信できる機能はどのように実装されていますか? XForm エディターのこのフィールドがオフの場合、ユーザーはフォームを 1 回しか送信できません。

匿名ユーザーの場合、Cookie に基づいていると思いましたが、関連する Cookie が送信されているのを確認できません。EPiServer.XForms.XFormData.HasAlreadyPosted(Page page)ILSpy を見ると、永続化オプションが Database に設定されていない場合、または UserName が null の場合、実際に 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 が null でない場合、DDS をチェックして FormId と UserName が一致する送信があるかどうかを確認する Linq クエリがあります。

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) を見るとNULL、UserName 列に値がありません。上記の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 に答える