我正在使用TempData来允许在重定向后显示错误消息。为了兼容性,我使用List<string>
将消息添加到NotificationHelper类中的错误列表中:
if (TempData["errorNotification"] == null) {
TempData["errorNotification"] = new List<string> {
message
};
} else {
var data = (List<string>) TempData["errorNotification"];
data.Add(message);
TempData["errorNotification"] = data;
}
在控制器内部,我使用错误消息填充TempData,在return RedirectToAction()
调用之前,TempData包含一个字典记录List<string>
(确切地说:System.Collections.Generic.List`1[System.String]
)作为值但是在调用之后,在Terms()
函数内,该值变为数组(System.String[]
)。
[HttpGet]
public IActionResult Terms()
{
return View();
}
[HttpGet]
public IActionResult Index()
{
NotificationHelper.AddErrorNotification("error!", TempData);
return RedirectToAction("Terms");
}
问题是,为了使用数据,我在视图中转换类型:
var errorMessages = TempData["errorNotification"] as List<string>;
转换后我必须这样做:
var errorMessages = TempData["errorNotification"] as string[];
以上演员之一将返回null,因为期望错误的类型(取决于我是否尝试在重定向之前或之后渲染视图)。这是TempData的理想行为吗?如何确保视图可以提供一种特定类型?
答案 0 :(得分:2)
我最终选择使用IEnumerable
,正如@Stephen Muecke建议的那样,因为我只是在寻找迭代数据而不是扩展或更改数据。
因此,在视图中,我没有尝试猜测它是列表还是数组,而是使用IEnumerable
来解释这两个问题:
var errorMessages = TempData["errorNotification"] as IEnumerable<string>;
答案 1 :(得分:1)
如果要保留类型,则在将字符串列表分配给TempData
之前序列化它,然后在检索时对其进行反序列化。这就是我最终做的事情。虽然在我的情况下,我最终存储了NotifyEntry
的列表,而不是string
的列表。
public class NotifyEntry
{
public NotifyType Type { get; set; }
public string Text { get; set; }
}
public enum NotifyType
{
Success,
Information,
Warning,
Error
}