ポップアップメッセージを表示するためにTempDataにデータを追加するマイBaseControllerクラスにメソッドがあります。
protected void AddPopupMessage(SeverityLevels severityLevel, string title, string message)
{
var newPopupMessage = new PopupMessage()
{
SeverityLevel = severityLevel,
Title = title,
Message = message
};
_popupMessages.Add(newPopupMessage);
TempData["PopupMessages"] = _popupMessages;
}
_
アクションがビューを返す場合は、これはうまく機能します。アクションがRedirectotoActionを呼び出している場合は、次のエラーが発生します。
InvalidOperationException: The 'Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.TempDataSerializer' cannot serialize an object of type
_
何かご意見は ?
私はExceptionオブジェクトをtempdataにシリアル化しようとしていて、それを仕事にするために私自身のTempDataSerizerizerを作成しなければならない(私は既存のコードをコアに移行していました)。
// Startup.cs
services.AddSingleton<TempDataSerializer, JsonTempDataSerializer>();
// JsonTempDataSerializer.cs
using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.AspNetCore.Mvc.ViewFeatures.Infrastructure;
using Newtonsoft.Json;
using Newtonsoft.Json.Bson;
public class JsonTempDataSerializer : TempDataSerializer
{
private readonly JsonSerializer _jsonSerializer = JsonSerializer.CreateDefault(new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All, // This may have security implications
});
public override byte[] Serialize(IDictionary<string, object>? values)
{
var hasValues = values?.Count > 0;
if (!hasValues)
return Array.Empty<byte>();
using var memoryStream = new MemoryStream();
using var writer = new BsonDataWriter(memoryStream);
_jsonSerializer.Serialize(writer, values);
return memoryStream.ToArray();
}
public override IDictionary<string, object> Deserialize(byte[] unprotectedData)
{
using var memoryStream = new MemoryStream(unprotectedData);
using var reader = new BsonDataReader(memoryStream);
var tempDataDictionary = _jsonSerializer.Deserialize<Dictionary<string, object>>(reader)
?? new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
return tempDataDictionary;
}
};
_
このタイプのエラーが私に起こったもう1つのシナリオは、Aznid ConnecterとしてAzureadを持っていた場所です - Azuread Cookieを処理しようとすると、それはTempDataProviderを例外を投げ、それを不平を言いました。 INT64の型をシリアル化できませんでした。これは次のように修正されました:
services.AddMvc()
.AddNewtonsoftJson(options =>
options.SerializerSettings.ContractResolver =
new CamelCasePropertyNamesContractResolver());
_