asp.net 核心中的 TempData null [英] TempData null in asp.net core

查看:35
本文介绍了asp.net 核心中的 TempData null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆