Има грешка в Html.BeginForm()
помощник (този, който не приема никакви аргументи), когато се използва с cookieless="true"
. Не взема предвид идентификатора на сесията при генериране на url. Така че вместо:
<form action="/(S(kkt0zgbnuaoxad23ew33iod4))/home/index" method="post">
той генерира:
<form action="/home/index" method="post">
Когато публикувате в /home/index
автоматично се прави пренасочване към /(S(kkt0zgbnuaoxad23ew33iod4))
от ASP.NET. Пренасочването означава GET заявка => действието ви POST никога няма да бъде постигнато.
Като заобиколно решение можете да напишете персонализиран Html.BeginForm
помощник за коригиране на грешката:
public static class FormExtensions
{
public static IDisposable MyBeginForm(this HtmlHelper htmlHelper)
{
var rawUrl = htmlHelper.ViewContext.HttpContext.Request.RawUrl;
var formAction = htmlHelper.ViewContext.HttpContext.Response.ApplyAppPathModifier("~/") + rawUrl;
var builder = new TagBuilder("form");
builder.MergeAttributes(new RouteValueDictionary());
builder.MergeAttribute("action", formAction);
builder.MergeAttribute("method", HtmlHelper.GetFormMethodString(FormMethod.Post), true);
htmlHelper.ViewContext.Writer.Write(builder.ToString(TagRenderMode.StartTag));
var form = new MvcForm(htmlHelper.ViewContext);
return form;
}
}
и след това използвайте:
@using (Html.MyBeginForm())
{
...
}
Що се отнася до другите претоварвания на помощника BeginForm, те трябва да работят добре и да генерират правилно действие, съдържащо идентификатора на сесията.