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
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
An der Middleware-Reihenfolge, wie sie in offiziellen Dokumenten beschrieben ist, ist nichts auszusetzen.
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.
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"];