Asp.netコアでTempDataを使用しようとしていますが、TempDataのgetメソッドでnull値を取得しています。誰でもasp.netコアでTempDataを使用する方法を教えてください
以下は、私が研究ごとに追加したものです。
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の値が表示されます。
[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;
}
これがデバッグセッションの画像です
ASP Core 2.1に移行した後、この問題が発生し、1日作業した後、解決策を見つけます。
startup.Configure()でapp.UseCookiePolicy();
はapp.UseMVC();
の後でなければなりません
official docs で説明されているミドルウェアの注文に問題はありません。
ただし、Cookieポリシーの適用(UseCookiePolicy)を使用すると、ブラウザーに送信されるessentialCookieとTempdataプロバイダーからのCookieは必須ではありません、したがって問題です。 公式ドキュメント に従って、それを必須にする必要があります。
TempdataプロバイダーのCookieは必須ではありません。追跡が無効になっている場合、Tempdataプロバイダーは機能しません。追跡が無効になっているときにTempdataプロバイダーを有効にするには、Startup.ConfigureServicesでTempData Cookieを必須としてマークします
// 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;
});
これらの行を追加すると、ミドルウェアを並べ替えることなく問題を解決できます。
すべてのパッケージを同じバージョンにアップグレードしてください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
で試してみてください、動作します。
また、set ASPNETCORE_ENVIRONMENT = Development環境変数を使用して環境を設定できます。
[〜#〜] ps [〜#〜]
ASP.NET Core MVC
は、TempData
のController
プロパティを公開します。 TempData
は、現在の要求の後の単一の要求でのみ使用可能になる必要がある一時データを格納するために使用できます。
TempDataDictionary
内のオブジェクトが読み取られると、その要求の終了時に削除対象としてマークされます。
Peek
メソッドとKeep
メソッドを使用すると、削除のマークを付けずに値を読み取ることができます。値がTempData
に保存された最初のリクエストに戻るとしましょう。
Peek
を使用すると、1回の呼び出しで削除のマークを付けずに値を取得できます。
//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
を使用して、削除するマークが付けられたキーを指定します。オブジェクトを取得し、後で削除からオブジェクトを保存することは、2つの異なる呼び出しです。
//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"];