web-dev-qa-db-fra.com

TempData null dans le noyau asp.net

J'essaie d'utiliser TempData dans le noyau asp.net Cependant, j'obtiens une valeur nulle sur la méthode get de TempData. Quelqu'un peut-il me faire savoir comment utiliser TempData dans le noyau asp.net

Voici les choses que j'ai ajoutées selon la recherche.

Fichier Project.json

{
  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.1",
      "type": "platform"
    },
    "Microsoft.AspNetCore.Mvc": "1.0.1",
    "Microsoft.AspNetCore.Routing": "1.0.1",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.1",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
    "Microsoft.Extensions.Configuration.Json": "1.0.0",
    "Microsoft.Extensions.Logging": "1.1.0",
    "Microsoft.Extensions.Logging.Console": "1.0.0",
    "Microsoft.Extensions.Logging.Debug": "1.0.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
    "Microsoft.EntityFrameworkCore.SqlServer": "1.1.0",
    "Microsoft.EntityFrameworkCore.Tools": "1.1.0-preview4-final",
    "Microsoft.EntityFrameworkCore.Design": "1.1.0",
    "Microsoft.EntityFrameworkCore.SqlServer.Design": "1.1.0",
    "DataBase": "1.0.0-*",
    "UnitOfWork": "1.0.0-*",
    "ViewModel": "1.0.0-*",
    "Common": "1.0.0-*",
    "System.IdentityModel.Tokens.Jwt": "5.0.0",
    "Microsoft.AspNetCore.Authentication.JwtBearer": "1.0.0",
    "Microsoft.AspNetCore.Diagnostics": "1.0.0",
    "Microsoft.AspNetCore.StaticFiles": "1.0.0",
    "Microsoft.AspNetCore.Session": "1.1.0",
    "Microsoft.Extensions.Caching.Memory": "1.1.0"
  },

  "tools": {
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final",
    "Microsoft.EntityFrameworkCore.Tools.DotNet": "1.0.0-preview3-final",
    "Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final"
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dotnet5.6",
        "portable-net45+win8"
      ]
    }
  },

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },

  "runtimeOptions": {
    "configProperties": {
      "System.GC.Server": true
    }
  },

  "publishOptions": {
    "include": [
      "wwwroot",
      "**/*.cshtml",
      "appsettings.json",
      "web.config"
    ]
  },

  "scripts": {
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }
}

fichier start.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddMemoryCache();
    services.AddSession();
    // Add framework services.
    services.AddMvc();
    services.AddTransient<IMarketUOW, MarketUow>();
    services.AddTransient<ICategoryUow, CategoryUow>();
    services.AddTransient<IUserProfileUow, UserProfileUow>();
    services.AddTransient<IItemUow, ItemUow>();

    services.AddTransient(typeof(IGenericRepository<>), typeof(GenericRepository<>));
    var connection = Configuration.GetConnectionString("DefaultConnection");
    services.AddDbContext<EmakitiContext>(options => options.UseSqlServer(connection));
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.UseSession();
    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
        });
    }

Voici l'implémentation de tempdata. Lorsque cette méthode est appelée, je peux voir la valeur dans TempData.

[HttpGet("{pageNumber}")]
public GenericResponseObject<List<MarketViewModel>> GetMarketList(int pageNumber)
{
    TempData["Currentpage"] = pageNumber;
    TempData.Keep("Currentpage");
    GenericResponseObject<List<MarketViewModel>> genericResponseObject = new GenericResponseObject<List<MarketViewModel>>();
    genericResponseObject.IsSuccess = false;
    genericResponseObject.Message = ConstaintStingValue.Tag_ConnectionFailed;
    try
    {
        var marketItem = _iMarketUow.GetMarketList(pageNumber);
        genericResponseObject.Data = marketItem.Item1;
        var totalPages = (int)Math.Ceiling((decimal)marketItem.Item2 / (decimal)10);
        genericResponseObject.TotalPage = totalPages;
        genericResponseObject.IsSuccess = true;
        genericResponseObject.Message = ConstaintStingValue.Tag_SuccessMessageRecord;
        genericResponseObject.Message = ConstaintStingValue.Tag_ConnectionSuccess;
    }
    catch (Exception exception)
    {
        genericResponseObject.IsSuccess = false;
        genericResponseObject.Message = exception.Message;
        genericResponseObject.ErrorCode = exception.HResult;
        genericResponseObject.ExceptionErrorMessage = exception.StackTrace;
    }
    return genericResponseObject;
}

Mais la méthode ci-dessous a une valeur nulle dans les données temporaires.

[HttpPost]
public GenericResponseObject<List<MarketViewModel>> AddUpdateMarket([FromBody] MarketViewModel marketViewModel)
{
    GenericResponseObject<List<MarketViewModel>> genericResponseObject = new GenericResponseObject<List<MarketViewModel>>();
    genericResponseObject.IsSuccess = false;
    genericResponseObject.Message = ConstaintStingValue.Tag_ConnectionFailed;

    if (marketViewModel!= null && ModelState.IsValid)
    {
        try
        {
            _iMarketUow.AddUpdateMarketList(marketViewModel);
            genericResponseObject = GetMarketList(Convert.ToInt16(TempData.Peek("Currentpage")));
        }
        catch (Exception exception)
        {
            genericResponseObject.IsSuccess = false;
            genericResponseObject.Message = exception.Message;
            genericResponseObject.ErrorCode = exception.HResult;
            genericResponseObject.ExceptionErrorMessage = exception.StackTrace;
        }
    }
    else
    {
        genericResponseObject.Message = ConstaintStingValue.Tag_InputDataFormatNotMatch;
    }
    return genericResponseObject;
}

Voici l'image de la session de débogage

first request of http which hold the value to the tempdata

null value on the second request

26
San Jaisy

Après avoir migré vers ASP Core 2.1, j'ai eu ce problème et après avoir travaillé pendant une journée, trouvez la solution:

dans Startup.Configure () app.UseCookiePolicy(); devrait être après app.UseMVC();

59
HamedH

Il n'y a rien de mal avec l'ordre des middlewares comme décrit sur documents officiels , ce qui est

  1. Gestion des exceptions/erreurs
  2. Protocole de sécurité de transport strict HTTP
  3. Redirection HTTPS
  4. Serveur de fichiers statiques
  5. Application de la politique en matière de cookies
  6. Authentification
  7. Session
  8. MVC

Mais lorsque nous utilisons l'application de la politique en matière de cookies (UseCookiePolicy), seul cookie essentiel sera envoyé au navigateur et au cookie du fournisseur Tempdata n'est pas indispensable d'où le problème. Nous devons donc le rendre essentiel selon documentation officielle :

Le cookie du fournisseur Tempdata n'est pas essentiel. Si le suivi est désactivé, le fournisseur Tempdata n'est pas fonctionnel. Pour activer le fournisseur Tempdata lorsque le suivi est désactivé, marquez le cookie TempData comme essentiel dans Startup.ConfigureServices

// The Tempdata provider cookie is not essential. Make it essential
// so Tempdata is functional when tracking is disabled.
services.Configure<CookieTempDataProviderOptions>(options => {
   options.Cookie.IsEssential = true;
});

L'ajout de ces lignes devrait résoudre votre problème sans réorganiser le middleware.

17
Nugroho Budi

Veuillez mettre à niveau tous vos packages vers la même version 1.1.0 ajouter également un service de mise en cache. Voici les éléments requis pour utiliser TempData dans Asp.Net Core

Project.json

"Microsoft.AspNetCore.Session": "1.1.0"

Voici le fichier Startup.cs. - Méthode ConfigureServices

public void ConfigureServices(IServiceCollection services)
{
     services.AddMemoryCache();
     services.AddSession();
     services.AddMvc();
}

Et configurer la méthode.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.UseSession();
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
    });
}

Essayez maintenant avec TempData, cela fonctionnera.

Et vous pouvez définir l'environnement avec set ASPNETCORE_ENVIRONMENT = Variable d'environnement de développement.

PS

ASP.NET Core MVC expose la propriété TempData sur un Controller. TempData peut être utilisé pour stocker des données transitoires qui ne doivent être disponibles que pour une seule demande après la demande en cours.

Lorsqu'un objet dans un TempDataDictionary est lu, il sera marqué pour suppression à la fin de cette demande.

Les méthodes Peek et Keep vous permettent de lire la valeur sans la marquer pour suppression. Supposons que nous revenions à la première demande où la valeur a été enregistrée dans TempData.

Avec Peek vous obtenez la valeur sans la marquer pour suppression avec un seul appel.

//second request, PEEK value so it is not deleted at the end of the request
object value = TempData.Peek("value");

//third request, read value and mark it for deletion
object value = TempData["value"];

Avec Keep, vous spécifiez une clé qui a été marquée pour la suppression que vous souhaitez conserver. La récupération de l'objet et sa sauvegarde ultérieure de la suppression sont deux appels différents.

//second request, get value marking it from deletion
object value = TempData["value"];
//later on decide to keep it
TempData.Keep("value");

//third request, read value and mark it for deletion
object value = TempData["value"];
15
Ahmar