C# 从列表隐式强制转换的TempData值<;字符串>;重定向到操作()后的字符串[]
我使用TempData允许在重定向后显示错误消息。为了兼容性,我使用C# 从列表隐式强制转换的TempData值<;字符串>;重定向到操作()后的字符串[],c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,我使用TempData允许在重定向后显示错误消息。为了兼容性,我使用列表将消息添加到NotificationHelper类中的错误列表中: if (TempData["errorNotification"] == null) { TempData["errorNotification"] = new List<string> { message }; } else { var data = (List<string>) TempDa
列表
将消息添加到NotificationHelper类中的错误列表中:
if (TempData["errorNotification"] == null) {
TempData["errorNotification"] = new List<string> {
message
};
} else {
var data = (List<string>) TempData["errorNotification"];
data.Add(message);
TempData["errorNotification"] = data;
}
问题是为了使用数据,我在视图中强制转换类型,如下所示:
var errorMessages=TempData[“errorNotification”]作为列表代码>
在转换之后,我必须这样做:
var errorMessages=TempData[“errorNotification”]作为字符串[]代码>
由于预期类型错误(取决于我是在重定向之前还是之后渲染视图),上述强制转换之一将返回为null。这是TempData想要的行为吗?如何确保视图可以预期提供一种特定类型?如果要保留该类型,请先序列化字符串列表,然后将其分配给TempData
,然后在检索时反序列化。这就是我最后做的。虽然在我的例子中,我最终存储了NotifyEntry
的列表,而不是字符串的列表
public class NotifyEntry
{
public NotifyType Type { get; set; }
public string Text { get; set; }
}
public enum NotifyType
{
Success,
Information,
Warning,
Error
}
正如@Stephen Muecke所建议的那样,我最终使用了IEnumerable
,因为我只是想迭代数据,而不是扩展或更改数据
因此,在视图中,我没有尝试猜测它是列表还是数组,而是使用IEnumerable
来解释这两种情况:
var errorMessages = TempData["errorNotification"] as IEnumerable<string>;
var errorMessages=TempData[“errorNotification”]作为IEnumerable;
您可以始终使用var errorMessages=TempData[“errorNotification”]作为IEnumerable代码>但无论如何,您确实不应该在视图中使用该代码(您应该将其指定给视图模型属性(或ViewBag
属性)在控制器中method@StephenMuecke感谢您的输入。我假设您指的是返回视图的方法,因为据我所知,这就是ViewBag的工作原理。不过,此通知背后的想法是,无论重定向如何,它都将显示出来,因此,当我使用AddErrorNotification方法时,我不必有任何信息关于哪个视图将显示它。这是一个有趣的工作。但是,你知道它是否“正确”吗行为还是将列表转换为数组的错误?感谢您的输入-我决定在视图中使用IEnumerable,在那里我读取TempData,因为我不会以任何方式更改该数据。TempData本质上只是KeyValuePair
的集合,因此存储完整对象没有问题。尽管现在我想起了我以前的决定,我试图记住为什么我要先发制人地序列化我的值,但我记不起原因。我必须尝试直接存储它,而不进行序列化,看看是否有任何东西弹出来提醒我为什么这样做…:-P
var errorMessages = TempData["errorNotification"] as IEnumerable<string>;