sql >> Base de Datos >  >> RDS >> Sqlserver

Por qué Asp.net MVC4 no puede usar el almacenamiento de estado de sesión de SQL Server sin cookies

Hay un error en Html.BeginForm() ayudante (el que no acepta ningún argumento) cuando se usa con cookieless="true" . No tiene en cuenta la identificación de la sesión al generar la url. Así que en lugar de:

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

genera:

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

Cuando publicas en /home/index automáticamente se realiza una redirección a /(S(kkt0zgbnuaoxad23ew33iod4)) por ASP.NET. Una redirección significa una solicitud GET => su acción POST nunca se verá afectada.

Como solución, podría escribir un Html.BeginForm personalizado ayudante para corregir el error:

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

y luego usa:

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

En lo que respecta a las otras sobrecargas del ayudante BeginForm, deberían funcionar bien y generar la acción adecuada que contenga la identificación de la sesión.