Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Por que o Asp.net MVC4 não pode usar o armazenamento de estado sem cookies do SQL Server Session


Há um bug no Html.BeginForm() helper (aquele que não recebe argumentos) quando usado com cookieless="true" . Ele não leva em consideração o id da sessão ao gerar a url. Então, em vez de:
<form action="/(S(kkt0zgbnuaoxad23ew33iod4))/home/index" method="post">

ele gera:
<form action="/home/index" method="post">

Quando você publica em /home/index um redirecionamento é feito automaticamente para /(S(kkt0zgbnuaoxad23ew33iod4)) pelo ASP.NET. Um redirecionamento significa que uma solicitação GET => sua ação POST nunca será atingida.

Como solução alternativa, você pode escrever um Html.BeginForm personalizado ajudante para corrigir o 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 depois use:
@using (Html.MyBeginForm())
{
    ...
}

No que diz respeito às outras sobrecargas do auxiliar BeginForm, elas devem funcionar bem e gerar a ação adequada contendo o id da sessão.