Как использовать tempdata для возврата сообщения об ошибке - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь использовать временные данные для возврата сообщений, но выдает ошибку:

InvalidOperationException: Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.TempDataSerializer 'не может сериализовать объект типа

Я уже использую

        services.AddMvc().AddSessionStateTempDataProvider(); 

        app.UseSession()

        services.AddSession(options =>
        {
            // Set a short timeout for easy testing.
            options.IdleTimeout = TimeSpan.FromSeconds(10);
            options.Cookie.HttpOnly = true;
        });

Вот мой общий

FlashMessages.cshtml:

@using EnduroMotors.ViewModels
@{
var errorMessages = TempData["_error_messages"] as List<FlashMessageModel> 
?? new List<FlashMessageModel>();
var warningMessages = TempData["_warning_messages"] as 
List<FlashMessageModel> ?? new List<FlashMessageModel>();
var successMessages = TempData["_success_messages"] as 
List<FlashMessageModel> ?? new List<FlashMessageModel>();
var infoMessages = TempData["_info_messages"] as List<FlashMessageModel> ?? 
new List<FlashMessageModel>();
}

Вот моя модель представления:

FlashMessageModel

public class FlashMessageModel
{
    public string Title { get; set; }
    public string Message { get; set; }
}

А вот использование в контроллере:

Контроллер

    protected void ShowSuccessMessage(string message, string title = 
    "Success!")
    {
        var messages = 
    (List<FlashMessageModel>)TempData["_success_messages"] ?? new 
    List<FlashMessageModel>();
        messages.Add(new FlashMessageModel
        {
            Title = title,
            Message = message
        });
        TempData["_success_messages"] = messages;
    }

используя это с возвратом

    ShowSuccessMessage("You have completed.");

он должен показывать сообщение об успехе в индексе с @{Html.RenderPartial("FlashMessages");}, но вместо этого он дает

InvalidOperationException: Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.TempDataSerializer 'не может сериализовать объект типа' EnduroMotors.ViewModels.FlashMessageModel '. Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.TempDataSerializer.EnsureObjectCanBeSerialized (item item)

1 Ответ

0 голосов
/ 14 января 2019

TempData сериализует объекты в строки для хранения. Он поддерживает строковые, int и логические типы. Если вы хотите хранить более сложные типы, вы должны их сериализовать (и десериализовать) самостоятельно. JSON - это рекомендуемый формат. Следующие методы расширения используют статические методы JSON.NET JsonConvert, чтобы сделать это:

public static class TempDataExtensions
{
    public static void Set<T>(this ITempDataDictionary tempData, string key, T value) where T : class
    {
        tempData[key] = JsonConvert.SerializeObject(value);
    }
    public static T Get<T>(this ITempDataDictionary tempData, string key) where T : class
    {
        tempData.TryGetValue(key, out object o);
        return o ?? JsonConvert.DeserializeObject<T>((string)o);
    }
}

Подробнее об этом можно прочитать здесь: https://www.learnrazorpages.com/razor-pages/tempdata#limitations

...