Det finns en bugg i Html.BeginForm()
helper (den som inte tar några argument) när den används med cookieless="true"
. Den tar inte hänsyn till sessions-id när webbadressen genereras. Så istället för:
<form action="/(S(kkt0zgbnuaoxad23ew33iod4))/home/index" method="post">
den genererar:
<form action="/home/index" method="post">
När du postar till /home/index
en omdirigering görs automatiskt till /(S(kkt0zgbnuaoxad23ew33iod4))
av ASP.NET. En omdirigering innebär en GET-begäran => din POST-åtgärd kommer aldrig att träffas.
Som en lösning kan du skriva en anpassad Html.BeginForm
hjälpare för att fixa felet:
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;
}
}
och använd sedan:
@using (Html.MyBeginForm())
{
...
}
När det gäller de andra överbelastningarna av BeginForm-hjälparen bör de fungera bra och generera korrekta åtgärder som innehåller sessions-id:t.