Há um bug no
Html.BeginForm()
helper (aquele que não recebe argumentos) quando usado com cookieless="true"
. Ele não leva em consideração o id da sessão ao gerar a url. Então, em vez de:<form action="/(S(kkt0zgbnuaoxad23ew33iod4))/home/index" method="post">
ele gera:
<form action="/home/index" method="post">
Quando você publica em
/home/index
um redirecionamento é feito automaticamente para /(S(kkt0zgbnuaoxad23ew33iod4))
pelo ASP.NET. Um redirecionamento significa que uma solicitação GET => sua ação POST nunca será atingida. Como solução alternativa, você pode escrever um
Html.BeginForm
personalizado ajudante para corrigir o bug: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;
}
}
e depois use:
@using (Html.MyBeginForm())
{
...
}
No que diz respeito às outras sobrecargas do auxiliar BeginForm, elas devem funcionar bem e gerar a ação adequada contendo o id da sessão.