web-dev-qa-db-ja.com

ASP.NETコアのTempDataとRedirectToActionが働いていません

ポップアップメッセージを表示するために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
 _

何かご意見は ?

12
BrilBroeder

私は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;
    }
};
 _
0
pwhe23

このタイプのエラーが私に起こったもう1つのシナリオは、Aznid ConnecterとしてAzureadを持っていた場所です - Azuread Cookieを処理しようとすると、それはTempDataProviderを例外を投げ、それを不平を言いました。 INT64の型をシリアル化できませんでした。これは次のように修正されました:

    services.AddMvc()
    .AddNewtonsoftJson(options =>
           options.SerializerSettings.ContractResolver =
              new CamelCasePropertyNamesContractResolver());
 _

https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30デジタルViewSastcore-3.1&tabs=visual-studio#newtonsoftjson-jsonnet-support - *

0
David Barrows