RedirectToPage会丢失Razor Pages中的路由对象项内容

时间:2018-10-24 10:41:29

标签: c# razor-pages asp.net-core-routing

我正在尝试使用当前数据对象作为参数重定向到错误页面:

if (!dataObj.IsValid)
{
    return RedirectToPage("./Error", new { dataObj = dataObj });
}

该对象包含很多数据,我需要为Error页面提供一些属性(它们是类类型),但是在Error页面处理程序中,整个dataObj内容都已重置为默认值(null,0等)。如何传递这些数据?

1 个答案:

答案 0 :(得分:1)

路由值是您在URL中传递的简单值。您不能以这种方式传递复杂的对象。您可以使用TempData传递复杂对象以供下一个请求使用:https://www.learnrazorpages.com/razor-pages/tempdata

您将需要将该对象序列化为JSON,并可能使用Session作为数据的存储机制,而不是默认的基于cookie的存储。我使用以下扩展方法来序列化和反序列化用于TempData的复杂类型:

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
{
    object o;
    tempData.TryGetValue(key, out o);
    return o == null ? null : JsonConvert.DeserializeObject<T>((string)o);
}

在OnPost中,您可以这样做:

if (!dataObj.IsValid)
{
    TempData.Set("errors", dataObj);
    return RedirectToPage("./Error");
}

然后出错:

var errors = TempData.Get<WhateverTypeDataObjIs>("errors");