asp.net 核心中的 TempData null [英] TempData null in asp.net core
问题描述
我正在尝试在 asp.net 核心中使用 TempData 但是我在 TempData 的 get 方法中得到一个空值.任何人都可以让我知道如何在 asp.net core 中使用 TempData
以下是我根据研究添加的内容.
Project.json 文件
<代码>{依赖关系":{Microsoft.NETCore.App":{版本":1.0.1",类型":平台"},"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","数据库": "1.0.0-*","UnitOfWork": "1.0.0-*","ViewModel": "1.0.0-*","通用": "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"},工具": {"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"},构架": {netcoreapp1.0":{进口":["dotnet5.6",便携-net45+win8"]}},构建选项":{emitEntryPoint":真,保留编译上下文":真},运行时选项":{配置属性":{System.GC.Server":真}},发布选项":{包括": ["wwwroot","**/*.cshtml","appsettings.json",网络配置"]},脚本":{"postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%"]}}
start.cs 文件
public void ConfigureServices(IServiceCollection services){services.AddMemoryCache();服务.AddSession();//添加框架服务.服务.AddMvc();services.AddTransient<IMarketUOW, MarketUow>();services.AddTransient<ICategoryUow, CategoryUow>();services.AddTransient();services.AddTransient();services.AddTransient(typeof(IGenericRepository<>), typeof(GenericRepository<>));var connection = Configuration.GetConnectionString("DefaultConnection");services.AddDbContext(options => options.UseSqlServer(connection));}公共无效配置(IApplicationBuilder 应用程序,IHostingEnvironment 环境,ILoggerFactory loggerFactory){app.UseSession();app.UseMvc(routes =>{路线.MapRoute(名称:默认",模板:{controller=Home}/{action=Index}/{id?}");});}
这里是 tempdata 的实现.调用这个方法时,我可以看到 TempData 中的值.
[HttpGet("{pageNumber}")]public GenericResponseObject>GetMarketList(int pageNumber){TempData["Currentpage"] = pageNumber;TempData.Keep("当前页面");GenericResponseObject>genericResponseObject = new GenericResponseObject>();genericResponseObject.IsSuccess = false;genericResponseObject.Message = ConstaintStingValue.Tag_ConnectionFailed;尝试{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;}捕获(异常异常){genericResponseObject.IsSuccess = false;genericResponseObject.Message = exception.Message;genericResponseObject.ErrorCode = exception.HResult;genericResponseObject.ExceptionErrorMessage = exception.StackTrace;}返回通用响应对象;}
但是下面的方法在临时数据中有空值.
[HttpPost]public GenericResponseObject>AddUpdateMarket([FromBody] MarketViewModel marketViewModel){GenericResponseObject>genericResponseObject = new GenericResponseObject>();genericResponseObject.IsSuccess = false;genericResponseObject.Message = ConstaintStingValue.Tag_ConnectionFailed;if (marketViewModel!= null && ModelState.IsValid){尝试{_iMarketUow.AddUpdateMarketList(marketViewModel);genericResponseObject = GetMarketList(Convert.ToInt16(TempData.Peek("Currentpage")));}捕获(异常异常){genericResponseObject.IsSuccess = false;genericResponseObject.Message = exception.Message;genericResponseObject.ErrorCode = exception.HResult;genericResponseObject.ExceptionErrorMessage = exception.StackTrace;}}别的{genericResponseObject.Message = ConstaintStingValue.Tag_InputDataFormatNotMatch;}返回通用响应对象;}
这是调试会话的图像
已
如https://docs.microsoft.com/en-us/aspnet/core/security/gdpr?view=aspnetcore-2.2#tempdata-provider-and-session-state-cookies-arent-essential默认情况下,TempData cookie 由 CookiePolicy 中间件删除.这可以通过将其放入 Startup.ConfigureServices() 来更改:
//TempData 提供程序 cookie 不是必需的.使其必不可少//因此 TempData 在禁用跟踪时起作用.services.Configure(options => {options.Cookie.IsEssential = true;});
==============================================>
旧答案:
在迁移到 ASP Core 2.1 后,我遇到了这个问题,并在工作了一天后找到了解决方案:
在 Startup.Configure()app.UseCookiePolicy();
应该在 app.UseMVC();
之后罢工>
I am trying to use TempData in asp.net core However I am getting a null value on the get method of TempData. Can anyone please let me know how can I use TempData in asp.net core
Below are the things I, have added as per the research.
Project.json file
{
"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 file
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?}");
});
}
Here is the implementation of tempdata.When this method is called I can see the value in 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;
}
But the below method has null value in the temp data.
[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;
}
Here is the image of the debug session
Edited:
As Described in https://docs.microsoft.com/en-us/aspnet/core/security/gdpr?view=aspnetcore-2.2#tempdata-provider-and-session-state-cookies-arent-essential by default TempData cookies are removed by the CookiePolicy Middleware. this can be changed by putting this in 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;
});
=============================================
Old Answer:
After Migrating to ASP Core 2.1 I had this issue and after working for a day find the solution:
in Startup.Configure()
app.UseCookiePolicy();
should be after app.UseMVC();
这篇关于asp.net 核心中的 TempData null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!