it-swarm.com.de

TempData null im asp.net-Kern

Ich versuche, TempData im asp.net-Kern zu verwenden. Jedoch erhalte ich einen Nullwert für die get-Methode von TempData. Kann mir jemand bitte mitteilen, wie ich TempData in asp.net core verwenden kann

Unten sind die Dinge aufgeführt, die ich laut Recherche hinzugefügt habe.

Project.json-Datei

{
  "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 Datei

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

Hier ist die Implementierung von tempdata. Wenn diese Methode aufgerufen wird, kann ich den Wert in TempData sehen.

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

Die folgende Methode hat jedoch einen Nullwert in den temporären Daten.

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

Hier ist das Bild der Debug-Sitzung

first request of http which hold the value to the tempdata

null value on the second request

26
San Jaisy

Nach der Migration auf ASP Core 2.1) hatte ich dieses Problem und fand nach einem Tag Arbeit die Lösung:

in Startup.Configure () app.UseCookiePolicy(); sollte nach app.UseMVC(); stehen

59
HamedH

An der Middleware-Reihenfolge, wie sie in offiziellen Dokumenten beschrieben ist, ist nichts auszusetzen.

  1. Ausnahme/Fehlerbehandlung
  2. HTTP-Sicherheitsprotokoll für strengen Transport
  3. HTTPS-Umleitung
  4. Statischer Dateiserver
  5. Durchsetzung der Cookie-Richtlinien
  6. Authentifizierung
  7. Session
  8. MVC

Bei Verwendung der Cookie-Richtlinienerzwingung (UseCookiePolicy) wird jedoch nur ein wesentliches Cookie an den Browser und das Cookie vom Tempdata-Anbieter gesendet ist nicht wesentlich daher das Problem. Also müssen wir es unbedingt gemäß offizielle Dokumentation :

Das Cookie des Tempdata-Providers ist nicht unbedingt erforderlich. Wenn die Nachverfolgung deaktiviert ist, ist der Tempdata-Anbieter nicht funktionsfähig. Markieren Sie das TempData-Cookie in Startup.ConfigureServices als unbedingt erforderlich, um den TempData-Anbieter zu aktivieren, wenn die Nachverfolgung deaktiviert ist

// 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;
});

Das Hinzufügen dieser Zeilen sollte Ihr Problem lösen, ohne die Middleware neu zu ordnen.

17
Nugroho Budi

Bitte aktualisieren Sie alle Pakete auf dieselbe Version 1.1.0 Caching-Service hinzufügen. Hier sind die erforderlichen Dinge für die Verwendung von TempData in Asp.Net Core

Project.json

"Microsoft.AspNetCore.Session": "1.1.0"

Hier ist die Datei Startup.cs. - ConfigureServices-Methode

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

nd Configure-Methode.

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

Versuchen Sie es jetzt mit TempData, es wird funktionieren.

Und Sie können die Umgebung mit set ASPNETCORE_ENVIRONMENT = Entwicklungsumgebungsvariable festlegen.

PS

ASP.NET Core MVC macht die Eigenschaft TempData für ein Controller verfügbar. TempData kann zum Speichern vorübergehender Daten verwendet werden, die nur für eine einzelne Anforderung nach der aktuellen Anforderung verfügbar sein müssen.

Wenn ein Objekt in einem TempDataDictionary gelesen wird, wird es am Ende dieser Anforderung zum Löschen markiert.

Mit den Methoden Peek und Keep können Sie den Wert lesen, ohne ihn zum Löschen zu markieren. Angenommen, wir kehren zur ersten Anforderung zurück, in der der Wert in TempData gespeichert wurde.

Mit Peek erhalten Sie den Wert, ohne ihn mit einem einzigen Aufruf zum Löschen zu markieren.

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

Mit Keep geben Sie einen Schlüssel an, der zum Löschen markiert wurde und den Sie behalten möchten. Das Objekt abzurufen und später vor dem Löschen zu speichern, sind 2 verschiedene Aufrufe.

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