Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Perché Asp.net MVC4 non può utilizzare l'archiviazione dello stato della sessione di SQL Server senza cookie

C'è un bug in Html.BeginForm() helper (quello che non accetta argomenti) se utilizzato con cookieless="true" . Non tiene conto dell'ID sessione durante la generazione dell'URL. Quindi invece di:

<form action="/(S(kkt0zgbnuaoxad23ew33iod4))/home/index" method="post">

genera:

<form action="/home/index" method="post">

Quando pubblichi su /home/index viene automaticamente effettuato un reindirizzamento a /(S(kkt0zgbnuaoxad23ew33iod4)) da ASP.NET. Un reindirizzamento significa una richiesta GET => la tua azione POST non verrà mai raggiunta.

Come soluzione alternativa potresti scrivere un Html.BeginForm personalizzato aiutante per correggere il 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 poi usa:

@using (Html.MyBeginForm())
{
    ...
}

Per quanto riguarda gli altri overload dell'helper BeginForm, dovrebbero funzionare correttamente e generare un'azione appropriata contenente l'id di sessione.