1

目标

仅当 Session 不存在时才创建列表。

问题

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也已经存在。

那么,我该如何“解决”这个问题呢?

4

6 回答 6

4

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

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");
}
于 2013-06-20T20:19:20.957 回答
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");
}
于 2013-06-20T20:19:37.170 回答
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");
}
于 2013-06-20T20:24:35.587 回答
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)

不用担心。

于 2013-06-20T20:20:14.460 回答
1

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

于 2013-06-20T20:23:07.817 回答
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");
}

您的问题在于 #2 如果从未创建 products 变量怎么办?您希望编译器放置一个空白字符串吗?你想让它为空吗?你想让它放一个0吗?如果 #1 从未执行,产品甚至指的是什么?您需要将#1 的第一部分移出您的 if 语句,并简单地在 if 语句中为产品分配一个值,而无需在产品之前列出列表。

于 2013-06-20T20:33:40.190 回答