MVC中Action向静态方法传TempData报错:名称不在当前上下文
嘿,这个问题我之前也碰到过!你遇到的「名称不在当前上下文」错误,本质原因很简单:静态方法没办法访问Controller的实例成员。TempData是Controller类的实例属性,而你的PopulatePlant是静态方法——它属于整个类,不属于任何一个具体的Controller实例,自然找不到TempData这个东西。
接下来给你两个可行的解决思路,看你需求选:
思路1:把静态方法改成实例方法(最简单的方案)
如果这个PopulatePlant方法只在这个Controller里用,不需要被外部静态调用,直接去掉static关键字就行。这样方法就属于Controller的实例,就能直接访问TempData了:
[HttpPost] public ActionResult Index(FormData person) { TempData["EmpId"] = person.EmpId.ToString(); FormData Detail = new FormData(); Detail.PlantName = PopulatePlant(); // 直接调用实例方法 return View("MasterPage"); } // 去掉static,改成实例方法 private List<SelectListItem> PopulatePlant() { List<SelectListItem> PName = new List<SelectListItem>(); String connectionString = ConfigurationManager.ConnectionStrings["conndbprodnew"].ConnectionString; // 用using包裹资源,自动释放避免连接泄漏 using (OracleConnection connection = new OracleConnection(connectionString)) using (OracleCommand command = new OracleCommand("select nvl(count(1),0) from Tdc_Product1 where TDC_NO=:COLUMN1", connection)) { command.CommandType = CommandType.Text; command.Parameters.AddWithValue(":COLUMN1", TempData["EmpId"]); // 补上查询和填充列表的逻辑(你原来的代码缺失这部分) connection.Open(); var countResult = command.ExecuteScalar(); PName.Add(new SelectListItem { Text = $"匹配数量:{countResult}", Value = countResult.ToString() }); } return PName; }
思路2:保留静态方法,传入参数
如果因为某些原因必须保留PopulatePlant的静态特性(比如其他地方要静态调用它),那就在调用的时候把EmpId作为参数传进去,不要让静态方法去访问实例成员:
[HttpPost] public ActionResult Index(FormData person) { string empId = person.EmpId.ToString(); TempData["EmpId"] = empId; // 依然可以存TempData给视图使用 FormData Detail = new FormData(); Detail.PlantName = PopulatePlant(empId); // 把empId作为参数传入静态方法 return View("MasterPage"); } // 静态方法接收empId参数 private static List<SelectListItem> PopulatePlant(string empId) { List<SelectListItem> PName = new List<SelectListItem>(); String connectionString = ConfigurationManager.ConnectionStrings["conndbprodnew"].ConnectionString; using (OracleConnection connection = new OracleConnection(connectionString)) using (OracleCommand command = new OracleCommand("select nvl(count(1),0) from Tdc_Product1 where TDC_NO=:COLUMN1", connection)) { command.CommandType = CommandType.Text; command.Parameters.AddWithValue(":COLUMN1", empId); // 使用传入的参数 connection.Open(); var countResult = command.ExecuteScalar(); PName.Add(new SelectListItem { Text = $"匹配数量:{countResult}", Value = countResult.ToString() }); } return PName; }
另外提醒你:原来的代码只创建了查询命令,但没有执行查询和填充PName列表,记得补上这部分逻辑,不然返回的是空列表哦。还有用using语句包裹数据库连接和命令是个好习惯,能自动释放资源,避免数据库连接泄漏。
内容的提问来源于stack exchange,提问作者Mohan
相关产品推荐
相关产品推荐

