2017-01-19 23 views
7

Próbuję użyć TempData w rdzeniu asp.net Jednak otrzymuję wartość null na metodę get TempData. Czy ktoś może proszę dać mi znać, jak mogę użyć TempData w rdzeniu asp.netTempData null w asp.net core

Poniżej znajdują się rzeczy, które dodałem zgodnie z badaniami. złożyć

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

Oto realizacja tempdata.When ta metoda nazywa widzę wartość w 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; 
} 

Jednak poniższa metoda ma wartość pustą w danych tymczasowych.

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

Oto obraz sesji debugowania

first request of http which hold the value to the tempdata

null value on the second request

Odpowiedz

13

Proszę uaktualnić wszystkie pakiety do tej samej wersji 1.1.0 dodać usługę buforowania, jak również. Oto niezbędne rzeczy do korzystania TempData w Asp.Net Core

Project.json

"Microsoft.AspNetCore.Session": "1.1.0" 

Oto plik Startup.cs. - ConfigureServices metoda

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMemoryCache(); 
    services.AddSession(); 
    services.AddMvc(); 
} 

i sposób Konfiguruj.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    app.UseSession(); 
     app.UseMvc(routes => 
     { 
      routes.MapRoute(
        name: "default", 
        template: "{controller=Home}/{action=Index}/{id?}"); 
    }); 
} 

Teraz spróbuj TempData, to będzie działać.

I można ustawić środowisko za pomocą zestawu ASPNETCORE_ENVIRONMENT = Zmienna środowiska programistycznego.

PS

ASP.NET Core MVC naraża właściwość TempData na Controller. TempData może służyć do przechowywania danych przejściowych, które muszą być dostępne dla pojedynczego żądania po bieżącym żądaniu.

Po odczytaniu obiektu z TempDataDictionary zostanie on oznaczony do usunięcia na końcu tego żądania.

Metody Peek i Keep umożliwiają odczytanie wartości bez oznaczania jej do usunięcia. Powiedzmy, że wróciliśmy do pierwszego żądania, w którym wartość została zapisana na TempData.

Z wartością Peek otrzymasz wartość bez oznaczania jej do usunięcia za pomocą pojedynczego połączenia.

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

Z Keep podać klucz, który został zaznaczony do usunięcia, które chcesz zachować. Pobieranie obiektu, a później zapisywanie go przed usunięciem, to 2 różne połączenia.

//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

Nie to nie zadziałało ..... –

+0

Czy odczytałeś wartość tempdata w widoku? – Ahmar

+0

Próbuję użyć w drugim żądaniu http. Pierwsza metoda zapisuje wartość do tempdata, a druga żądanie pobiera dane z tempdata. Jednak otrzymuję wartość null, aby uzyskać część –