【问题标题】:TempData value implicitly cast from List<string> to string[] after RedirectToAction()TempData 值在 RedirectToAction() 之后从 List<string> 隐式转换为 string[]
【发布时间】:2017-12-31 13:01:08
【问题描述】:

我正在使用 TempData 允许在重定向后显示错误消息。为了兼容性,我使用List&lt;string&gt; 将消息添加到 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&lt;string&gt;(准确地说: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&lt;string&gt;;

在转换之后我必须这样做:

var errorMessages = TempData["errorNotification"] as string[];

由于预期类型错误(取决于我是否尝试在重定向之前或之后渲染视图),上述转换之一将返回为 null。这是 TempData 的理想行为吗?如何确保视图可以预期提供一种特定类型?

【问题讨论】:

  • 你总是可以使用var errorMessages = TempData["errorNotification"] as IEnumerable&lt;string&gt;;,但你真的不应该在视图中使用该代码(你应该将它分配给控制器中的视图模型属性(或ViewBag属性)方法
  • @StephenMuecke 感谢您的意见。我假设您的意思是返回视图的方法,因为据我了解 - 这就是 ViewBag 的工作方式。这个通知背后的想法是不管重定向如何都会显示它,所以当我使用 AddErrorNotification 方法时,我不需要知道哪个视图将显示它。

标签: c# asp.net-core asp.net-core-mvc


【解决方案1】:

我最终还是使用了IEnumerable,正如@Stephen Muecke 所建议的那样,因为我只是在寻找迭代数据而不是扩展或更改它。

所以在视图中,我没有尝试猜测它是列表还是数组,而是使用IEnumerable 来解释两者:

var errorMessages = TempData["errorNotification"] as IEnumerable<string>;

【讨论】:

    【解决方案2】:

    如果您想保留类型,请先序列化您的字符串列表,然后再将其分配给TempData,然后在检索时对其进行反序列化。这就是我最终做的。虽然在我的情况下,我最终存储了 NotifyEntry 的列表,而不是 string 的列表。

    public class NotifyEntry
    {
        public NotifyType Type { get; set; }
        public string Text { get; set; }
    }
    
    public enum NotifyType
    {
        Success,
        Information,
        Warning,
        Error
    }
    

    【讨论】:

    • 这是一项有趣的工作。但是,您知道列表转换为数组是“正确”行为还是错误?感谢您的输入 - 我决定在视图中使用 IEnumerable,我在其中读取 TempData,因为我不会以任何方式更改该数据。
    • 嗯,TempData 本质上只是KeyValuePair&lt;string, object&gt; 的集合,所以存储一个完整的对象是没有问题的。虽然现在我回想我之前的决定,但我正在努力回忆我为什么要先发制人地序列化我的价值,我不记得原因了。我将不得不尝试直接存储它而不进行序列化,看看是否有任何弹出来提醒我为什么要这样...... :-P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    相关资源
    最近更新 更多