仅在会话不存在时创建列表

时间:2013-06-20 20:16:05

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

目标

仅在会话不存在时创建列表。

问题

Visual Studio返回我:

  

当前上下文中不存在名称products

我有以下代码:

public ActionResult Add(int productId)
{
    if (Session["ShoppingList"] == null)
    {
        List<int> products = new List<int>();
    }

    products.Add(productId);
    Session["ShoppingList"] = products;
    return View("Index");
}

是的,我知道,我没有列出if products变量。但是,如果会话存在,意味着“列表”已经存在,理论上products已经存在。

那么,我该如何“修复”这个呢?

6 个答案:

答案 0 :(得分:4)

尝试在products之外定义变量if,如果会话变量为null,则创建新列表,否则检索存储在会话变量中的变量:

public ActionResult Add(int productId)
{
    List<int> products;

    if (Session["ShoppingList"] == null)
    {
        products = new List<int>();
    }
    else
    {
        products = (List<int>) Session["ShoppingList"];
    }

    products.Add(productId);
    Session["ShoppingList"] = products;
    return View("Index");
}

答案 1 :(得分:4)

我不是100%肯定如果我得到了问题,但这可能会成功

public ActionResult Add(int productId)
{
    var products = Session["ShoppingList"] as List<int> ?? new List<int>();
    products.Add(productId);
    Session["ShoppingList"] = products;
    return View("Index");
}

答案 2 :(得分:4)

更简洁的代码,每次都不需要您重新分配Session["ShoppingList"]

public ActionResult Add(int productId)
{
    if (Session["ShoppingList"] == null)
    {
        Session["ShoppingList"] = new List<int>();
    }

    ((List<int>)Session["ShoppingList"]).Add(productId);
    return View("Index");
}

答案 3 :(得分:3)

这里有你称之为可变范围的东西。因为变量products是在子块中定义的,所以它不会在该块之外可见。

也许这就是你想要的?

public ActionResult Add(int productId)
{

    if (Session["ShoppingList"] == null)
    {           
        Session["ShoppingList"] = new List<int>();
    }

    List<int> products = (List<int>)Session["ShoppingList"]
    products.Add(productId);
    return View("Index");

}

真正对会话的访问应该像这样封装:

public static class SessionStore
{
    private const string shoppingListKey = "ShoppingList";
    public static List<int> ShoppingList
    {
        get
        {
            return Session[shoppingListKey] ??                      
               (Session[shoppingListKey] = new List<int>());
        }
    }
}

现在在你的控制器中你可以

SessionStore.ShoppingList.Add(productId)

而不用担心。

答案 4 :(得分:1)

编译器抱怨,因为产品是在if代码块中声明的,它具有自己的范围。在代码块之后,产品超出范围,并且无法引用。解决这个问题的两种最简单的方法是在进入if块的范围之前声明产品,并且只在块内实例化它,或者声明并实例化它,并将其分配给if块内的Session["ShoppingList"]

答案 5 :(得分:1)

public ActionResult Add(int productId)
{
    if (Session["ShoppingList"] == null)
    {
        List<int> products = new List<int>(); //#1 conditionally creates the variable only if it is null
    }

    products.Add(productId);
    Session["ShoppingList"] = products; //#2 makes the session equal to something that may not ever actually exist
    return View("Index");
}

如果从未创建过products变量,那么问题在于#2您希望编译器放一个空字符串吗?你想要它吗?你想要它0吗?如果从未执行#1,产品甚至会引用什么?您需要取#1的第一部分并将其从if语句中移出,并简单地在if语句中为产品分配一个值,而不在产品之前使用List。