仅在会话不存在时创建列表。
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
已经存在。
那么,我该如何“修复”这个呢?
答案 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。