2017-01-19 119 views
7

我想在asp.net核心中使用TempData但是我得到TempData的get方法的空值。任何人都可以请让我知道我怎样才能在asp.net核心使用TempData在asp.net核心TempData null

以下是我,根据研究增加的东西。

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

这里是tempdata.When的实现调用此方法我可以看到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; 
} 

但下面的方法在临时数据中有空值。

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

这里是调试会话

first request of http which hold the value to the tempdata

null value on the second request

回答

13

请升级您的所有包,以相同的版本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暴露在ControllerTempData财产。 TempData可用于存储暂时数据,该数据仅在当前请求之后才可用于单个请求。

当读取TempDataDictionary中的对象时,它将在该请求结束时被标记为删除。

PeekKeep方法允许您读取该值而不标记为删除。假设我们回到第一个请求,其中值被保存到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你指定被标记为要保留删除的关键。检索对象并稍后保存以免被删除是两个不同的调用。

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

不,它没有工作..... –

+0

你读过tempdata值吗? – Ahmar

+0

我想在第二个http请求中使用。第一种方法将值存储到tempdata中,第二种请求从tempdata中获取数据。但是,我得到空值来获得部分 –