2017-01-19 3 views
7

asp.net 코어에서 TempData를 사용하려고합니다.하지만 TempData의 get 메소드에 null 값이 나타납니다. 아무도 내가 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 값을 볼 수있다라고 tempdata.When의 구현 파일.

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

그러나 아래의 방법은 임시 데이터에 null 값을 가지고 있습니다. 여기

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

뿐만 아니라 캐싱 서비스를 추가 동일한 버전 1.1.0에 디버그 세션

first request of http which hold the value to the tempdata

null value on the second request

답변

13

당신의 모든 패키지를 업그레이드하십시오의 이미지입니다. 여기에 여기에 Startup.cs 파일입니다

"Microsoft.AspNetCore.Session": "1.1.0" 

Project.json

Asp.Net Core

TempData을 사용하기 위해 필요한 것들이다. - 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 MVCControllerTempData 속성을 노출시킨다. 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으로 삭제하려는 것으로 표시된 키를 지정하십시오. 객체를 가져오고 나중에 삭제에서 저장하는 것은 두 가지 다른 호출입니다.

+0

아니요. 작동하지 않았습니다 ..... –

+0

tempdata 값을 보셨습니까? – Ahmar

+0

두 번째 http 요청에서 사용하려고합니다. 첫 번째 방법은 tempdata에 값을 저장하고 두 번째 요청은 tempdata에서 데이터를 가져옵니다. 그러나 null 값을 얻으므로 –