Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi Asp.net MVC4 ne peut pas utiliser le stockage d'état de session SQL Server sans cookie

Il y a un bogue dans le Html.BeginForm() helper (celui qui ne prend aucun argument) lorsqu'il est utilisé avec cookieless="true" . Il ne prend pas en compte l'identifiant de session lors de la génération de l'url. Donc au lieu de :

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

il génère :

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

Lorsque vous publiez sur /home/index une redirection est automatiquement faite vers /(S(kkt0zgbnuaoxad23ew33iod4)) par ASP.NET. Une redirection signifie une requête GET => votre action POST ne sera jamais touchée.

Comme solution de contournement, vous pouvez écrire un Html.BeginForm personnalisé aide pour corriger le bogue :

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;
    }
}

puis utilisez :

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

En ce qui concerne les autres surcharges de l'assistant BeginForm, elles devraient fonctionner correctement et générer une action appropriée contenant l'identifiant de session.