我正在尝试使用当前数据对象作为参数重定向到错误页面:
if (!dataObj.IsValid)
{
return RedirectToPage("./Error", new { dataObj = dataObj });
}
该对象包含很多数据,我需要为Error页面提供一些属性(它们是类类型),但是在Error页面处理程序中,整个dataObj内容都已重置为默认值(null,0等)。如何传递这些数据?
答案 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");