同じ人がフォームを複数回送信できる機能はどのように実装されていますか? 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 クエリを実行している可能性があります。最初の匿名ユーザーからの空のユーザー名があり、誤検知を報告していますか?