TempData null no núcleo do asp.net

Eu estou tentando usar TempData no núcleo asp.net No entanto, estou recebendo um valor nulo no método get de TempData. Alguém pode por favor me avise como posso usar TempData no núcleo do asp.net

Abaixo estão as coisas que eu adicionei de acordo com a pesquisa.

Arquivo 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%" ] } } 

arquivo start.cs

 public void ConfigureServices(IServiceCollection services) { services.AddMemoryCache(); services.AddSession(); // Add framework services. services.AddMvc(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(typeof(IGenericRepository), typeof(GenericRepository)); var connection = Configuration.GetConnectionString("DefaultConnection"); services.AddDbContext(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?}"); }); } 

Aqui está a implementação de tempdata.Quando esse método é chamado, posso ver o valor em TempData.

 [HttpGet("{pageNumber}")] public GenericResponseObject<List> GetMarketList(int pageNumber) { TempData["Currentpage"] = pageNumber; TempData.Keep("Currentpage"); GenericResponseObject<List> genericResponseObject = new GenericResponseObject<List>(); 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; } 

Mas o método abaixo tem valor nulo nos dados temporários.

 [HttpPost] public GenericResponseObject<List> AddUpdateMarket([FromBody] MarketViewModel marketViewModel) { GenericResponseObject<List> genericResponseObject = new GenericResponseObject<List>(); 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; } 

Aqui está a imagem da session de debugging

primeiro pedido de http que detém o valor para o tempdata

valor nulo no segundo pedido

Após a migration para o ASP Core 2.1 eu tive esse problema e depois de trabalhar por um dia encontrar a solução:

em Startup.Configure () app.UseCookiePolicy(); deve ser depois de app.UseMVC();

Por favor, atualize todos os seus pacotes para a mesma versão 1.1.0 adicionar serviço de cache também. Aqui estão as coisas necessárias para usar o TempData no Asp.Net Core

Project.json

 "Microsoft.AspNetCore.Session": "1.1.0" 

Aqui está o arquivo Startup.cs. – método ConfigureServices

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

E configure o método.

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

Agora tente com TempData , vai funcionar.

E você pode definir o ambiente com o conjunto ASPNETCORE_ENVIRONMENT = Variável de ambiente de desenvolvimento.

PS

ASP.NET Core MVC expõe a propriedade TempData em um Controller . TempData pode ser usado para armazenar dados temporários que precisam estar disponíveis apenas para uma única solicitação após a solicitação atual.

Quando um object em um TempDataDictionary é lido, ele será marcado para exclusão no final dessa solicitação.

Os methods Peek e Keep permitem que você leia o valor sem marcá-lo para exclusão. Digamos que voltemos à primeira solicitação em que o valor foi salvo no TempData .

Com Peek você obtém o valor sem marcá-lo para exclusão com uma única chamada.

 //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"]; 

Com o Keep você especifica uma chave que foi marcada para exclusão que você deseja manter. Recuperar o object e, posteriormente, salvá-lo da exclusão são duas chamadas diferentes.

 //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"];