Der er en fejl i Html.BeginForm()
hjælper (den, der ikke tager nogen argumenter), når den bruges sammen med cookieless="true"
. Den tager ikke højde for sessions-id'et, når url'en genereres. Så i stedet for:
<form action="/(S(kkt0zgbnuaoxad23ew33iod4))/home/index" method="post">
det genererer:
<form action="/home/index" method="post">
Når du sender til /home/index
en omdirigering foretages automatisk til /(S(kkt0zgbnuaoxad23ew33iod4))
af ASP.NET. En omdirigering betyder en GET-anmodning => din POST-handling vil aldrig blive ramt.
Som en løsning kan du skrive en brugerdefineret Html.BeginForm
hjælper til at rette fejlen:
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;
}
}
og brug derefter:
@using (Html.MyBeginForm())
{
...
}
Hvad angår de andre overbelastninger af BeginForm-hjælperen, burde de fungere fint og generere korrekt handling indeholdende sessions-id'et.