【问题标题】:Show session list in view?在视图中显示会话列表?
【发布时间】:2016-05-19 12:03:27
【问题描述】:

我正在学习 ASP.NET MVC,但在理解和正确使用 session 方面存在一些问题。让我解释一下我做了什么以及我想要实现什么。

首先,我在 Home 控制器的 Index 方法中创建一个包含产品列表的会话。我还将一些默认产品添加到列表中,如下所示:

Session["ShoppingCart"] = new List<Products>() { new Products { ID = 1 }, new Products { ID = 2 } };

(我的目标是稍后在其他控制器中使用此会话以便能够添加产品,但现在我只想做一些测试。)

然后在 Shop 控制器中,我有一个操作方法来显示购物车的内容。这就是我开始迷失在这个美妙世界的地方。

我无法解决的问题是我应该如何对待 Session["ShoppingCart"] 以便我可以查看列表中的产品列表!?我应该有一个带有 IEnumerable 的视图,以便能够用剃刀对其列表进行迭代吗?

【问题讨论】:

  • 请注意,使用会话处理重要的数据时要小心。我必须处理一个使用购物车会话的电子商务解决方案,这是客户沮丧的一个巨大来源,因为他们的购物车就这样消失了,对他们来说似乎是随机的。事实上,会话是临时的和暂时的,如果您不使用像 SQL Server 这样的持久支持,更是如此。在 proc 会话中,只要应用程序池回收,它们就会被销毁。我建议将“购物车”保存到与他们的用户帐户绑定的数据库中,这样用户就不会丢失它。
  • @ChrisPratt 感谢您的信息。

标签: c# asp.net asp.net-mvc session razor


【解决方案1】:

你可以像这样在视图中编码

List<Products> list = (List<Products>)Session["ShoppingCart"];


@foreach(var item in list) 
{
        do what ever 
}

我希望我能为你工作。

【讨论】:

  • 感谢您的回答,我在单词列表下方看到一条红线,错误消息是:当前上下文中不存在名称列表。我必须在文件开头添加更多内容吗?
  • 认真的吗?您需要导入 System.Collections.Generic 程序集。
  • using System.Collections.Generic;。您应该能够右键单击并解决。
  • 正确的想法,但不要这样做;使用as,例如Session["ShoppingCart"] as List&lt;Product&gt;。如果无法强制转换,前者会抛出异常,而as 只会将变量设置为null。然后,您可以使用条件来检查 null 并相应地继续。
  • 我猜这里有一些误解!代码行: List list = ..... 应该在控制器中,对吧!?并使用 System.Collections.Generic;已经在那里了。我想知道视图,我在 Razor 中为每个循环找到了红线,我仍然有。我错过了什么?
【解决方案2】:

你也可以像下面给出的代码那样做

var list = Session["ShoppingCart"] as List<Products>;

我更喜欢使用 as 关键字,因为不能 100% 保证 Session 将包含列表(由于应用程序池刷新、网站重新启动等)。为您提供额外的防御以避免 NullReferenceException。

然后做你的过程

if (list != null){
   foreach(var item in list) 
   {
       your custom code
   }
}

希望对你有帮助

【讨论】:

    【解决方案3】:

    在这种情况下,您能做的最好的事情就是定义一个购物车类:

    public class Cart{
        IList<Products> Products {get; set;}
        // any other properties that you would need or structure this in way to store quantities, prices per line and so on
    }
    

    然后假设您在会话中存储它没有任何问题,您只需访问它(请注意,您始终需要转换从会话中获得的任何内容):

    var cart = (Cart) Session["ShoppingCart"];
    // do any work you need on the cart object
    

    【讨论】:

    • 感谢您的回答,但我真的需要使用 Cart 类吗?为什么我不能只将产品添加到列表中?
    • 可以,但是封装内容更干净、更容易。无论如何应用相同的逻辑,但不要将其转换为购物车,如果您不想使用包装类,只需将其转换为您的 List
    • 好的,但我不明白你的所有回答。 var cart = ..... 这在视图中吗?我应该在 var cart = .... 之前使用 @ 符号吗?如何循环产品列表?我需要一些帮助。
    • 是的,可以在视图或控制器中。语法适用于控制器,因为视图取决于您使用的视图引擎。 @{ var cart = (Cart) Session["ShoppingCart"];假设您使用的是 Razor。迭代和所有与原始问题无关的事情。只需搜索如何迭代 c# 列表。
    猜你喜欢
    • 2013-09-16
    • 2011-03-28
    • 1970-01-01
    • 2023-01-04
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    相关资源
    最近更新 更多