sql >> Databasteknik >  >> RDS >> Sqlserver

Varför Asp.net MVC4 inte kan använda den cookiefria tillståndslagringen för SQL Server Session

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.




  1. Hur man skapar ett lösenord med sex tecken i MySQL 5.7

  2. SQL - Pivottabell och grupp genom att inte fungera

  3. Förfluten tid från en given tid i databasen

  4. Hibernate Native Query-problem med namngivna parametrar