Как реализована функция Один и тот же человек может отправить форму несколько раз? Когда это поле в редакторе XForm снято, пользователь может отправить форму только один раз.
Я думал, что для анонимных пользователей это было основано на файле cookie, но я не вижу никаких соответствующих файлов cookie, передаваемых по сети. Глядя на EPiServer.XForms.XFormData.HasAlreadyPosted(Page page)
в ILSpy, видно, что на самом деле он проверяет файл cookie, если для параметров сохранения не установлено значение «База данных» или значение UserName равно null.
В этой ситуации он проверяет файл cookie с именем «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», поэтому я не вижу, как это работает.
Следуя логике для анонимных пользователей, если вы отправляете сообщение в базу данных и имя пользователя не равно нулю, существует запрос Linq, который проверяет DDS на наличие отправки с совпадающим идентификатором формы и именем пользователя.
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, который сравнивает имя пользователя анонимного пользователя с именами пользователей в таблице, из которых есть пустое имя от первого анонимного пользователя и сообщает о ложном срабатывании?