asp.net核心中的TempData null
我试图在asp.net核心中使用TempData但是我在TempData的get方法上得到一个null值。 任何人都可以告诉我如何在asp.net核心中使用TempData
以下是我根据研究添加的内容。
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%" ] } }
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?}"); }); }
这是tempdata的实现。当调用此方法时,我可以看到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; }
但是下面的方法在临时数据中具有空值。
[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; }
这是调试会话的图像
迁移到ASP Core 2.1后,我遇到了这个问题,工作了一天后找到了解决方案:
在Startup.Configure() app.UseCookiePolicy();
应该在app.UseMVC();
请将您的所有软件包升级到相同的版本1.1.0
添加缓存服务。 以下是在Asp.Net Core
使用TempData
所需的内容
Project.json
"Microsoft.AspNetCore.Session": "1.1.0"
这是Startup.cs文件。 – ConfigureServices方法
public void ConfigureServices(IServiceCollection services) { services.AddMemoryCache(); services.AddSession(); services.AddMvc(); }
和配置方法。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { app.UseSession(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
现在尝试使用TempData
,它会工作。
您可以使用设置ASPNETCORE_ENVIRONMENT =开发环境变量来设置环境。
PS
ASP.NET Core MVC
在Controller
上公开TempData
属性。 TempData
可用于存储瞬态数据,该瞬态数据仅需要在当前请求之后针对单个请求可用。
当读取TempDataDictionary
的对象时,它将在该请求结束时标记为删除。
Peek
和Keep
方法允许您读取值而不将其标记为删除。 假设我们回到第一个将值保存到TempData
。
使用Peek
您可以获得该值而无需通过单个调用将其标记为删除。
//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"];
使用Keep
您可以指定要保留的标记为删除的密钥。 检索对象以及稍后将其保存为删除是2个不同的调用。
//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"];