TempData null in asp.net core

Sto cercando di usare TempData in asp.net core Tuttavia sto ottenendo un valore nullo sul metodo get di TempData. Qualcuno può per favore fammi sapere come posso usare TempData nel nucleo di asp.net

Di seguito sono elencate le cose che ho aggiunto come da ricerca.

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

file 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?}"); }); } 

Ecco l’implementazione di tempdata. Quando viene chiamato questo metodo, posso vedere il valore in 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; } 

Ma il metodo sottostante ha valore null nei dati temporanei.

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

Ecco l’immagine della sessione di debug

prima richiesta di http che contiene il valore per il tempdata

valore null sulla seconda richiesta

Dopo la migrazione ad ASP Core 2.1 ho avuto questo problema e dopo aver lavorato per un giorno, trovo la soluzione:

in Startup.Configure () app.UseCookiePolicy(); dovrebbe essere dopo app.UseMVC();

Si prega di aggiornare tutti i pacchetti alla stessa versione 1.1.0 aggiungere il servizio di caching pure. Ecco le cose necessarie per l’utilizzo di TempData in Asp.Net Core

Project.json

 "Microsoft.AspNetCore.Session": "1.1.0" 

Ecco il file Startup.cs. – Metodo ConfigureServices

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

E configurare il metodo.

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

Ora prova con TempData , funzionerà.

Ed è ansible impostare l’ambiente con set ASPNETCORE_ENVIRONMENT = Variabile ambiente di sviluppo.

PS

ASP.NET Core MVC espone la proprietà TempData su un Controller . TempData ansible utilizzare TempData per memorizzare dati transitori che devono essere disponibili per una singola richiesta dopo la richiesta corrente.

Quando un object in un object TempDataDictionary viene letto, verrà contrassegnato per l’eliminazione alla fine di tale richiesta.

I metodi Peek e Keep ti consentono di leggere il valore senza contrassegnarlo per la cancellazione. Diciamo che torniamo alla prima richiesta in cui il valore è stato salvato su TempData .

Con Peek ottieni il valore senza contrassegnarlo per la cancellazione con una sola chiamata.

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

Con Keep si specifica una chiave che è stata contrassegnata per l’eliminazione che si desidera conservare. Recuperare l’object e in seguito salvarlo dall’eliminazione sono 2 chiamate diverse.

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