Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum Asp.net MVC4 die cookielose Speicherung des Sitzungszustands von SQL Server nicht verwenden kann

Es gibt einen Fehler in Html.BeginForm() Helfer (derjenige, der keine Argumente akzeptiert), wenn er mit cookieless="true" verwendet wird . Die Sitzungs-ID wird beim Generieren der URL nicht berücksichtigt. Also statt:

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

es generiert:

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

Wenn Sie an /home/index posten es erfolgt automatisch eine Umleitung zu /(S(kkt0zgbnuaoxad23ew33iod4)) von ASP.NET. Eine Umleitung bedeutet eine GET-Anforderung => Ihre POST-Aktion wird niemals getroffen.

Als Problemumgehung könnten Sie ein benutzerdefiniertes Html.BeginForm schreiben Helfer, um den Fehler zu beheben:

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

und verwenden Sie dann:

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

Soweit die anderen Überladungen des BeginForm-Hilfsprogramms betroffen sind, sollten sie gut funktionieren und die richtige Aktion generieren, die die Sitzungs-ID enthält.