MVC中Action返回视图与列表绑定失败问题求助
嘿,我帮你排查下这个问题,你遇到的错误根源是数据传递和视图Model的类型不匹配,还有视图里对Model的访问方式不对,咱们一步步来修复:
问题分析
- 你的Action方法返回的是
Detail.PlantName.ToList()(也就是List<SelectListItem>类型),但视图声明的Model是IList<FormData>——这俩类型完全不匹配,所以视图会报错“List不包含PlantName的定义”,因为List本身没有这个属性,只有FormData对象才有。 - 就算类型匹配,视图里直接用
Model.PlantName也不对,因为如果Model是列表,你得先取列表中的元素(比如Model[0].PlantName),但实际上你根本不需要传递列表,传递单个FormData对象就足够了。
具体修复步骤
1. 修正Action方法的返回值
把返回语句改成传递整个Detail对象(而不是只传PlantName列表),这样传递的是包含PlantName数据的FormData实例:
[HttpPost] public ActionResult Index(FormData person) { TempData["EmpId"] = person.EmpId.ToString(); FormData Detail = new FormData(); Detail.PlantName = PopulatePlant(TempData["EmpId"].ToString()); // 传递整个Detail对象,而不是单独的PlantName列表 return View("MasterPage", Detail); }
2. 修正视图的Model声明
把MasterPage.cshtml顶部的Model声明改成单个FormData对象(而不是列表),让视图和传递的数据类型对应:
@model Rm_Module.Models.FormData <body class="index-page"> @using (Html.BeginForm("Index", "Home", FormMethod.Post)) { <div class="collapse navbar-collapse" id="navigation-index"> <ul class="nav navbar-nav navbar-right"> <li> <i class="material-icons">home</i> Home </li> <li> <!-- 现在Model是FormData实例,可以直接访问PlantName属性 --> @Html.DropDownListFor(m => m.PlantId, Model.PlantName, "Please Select"); </li> </ul> </div> } </body>
3. 额外优化:修复数据库连接泄漏
你的PopulatePlant方法里,OracleConnection没有用using包裹,可能会导致连接泄漏,建议改成下面的写法(用using自动释放资源):
private static List<SelectListItem> PopulatePlant(string empID) { List<SelectListItem> PName = new List<SelectListItem>(); String connectionString = ConfigurationManager.ConnectionStrings["conndbprodnew"].ConnectionString; // 用using包裹connection,自动释放资源 using (OracleConnection connection = new OracleConnection(connectionString)) { OracleCommand command = new OracleCommand("SELECT DISTINCT PARAM.PAR_CD ,PARAM.PAR_DESC1 FROM PARAM WHERE PARAM.PAR_TYP = 'LOC' AND PAR_REG_IND = 'X' and Param.Par_Cd in (select plant_code from user_level_access where token_no = :token_no) ", connection); connection.Open(); command.CommandType = CommandType.Text; command.Parameters.AddWithValue(":token_no", empID); using (OracleDataReader sdr = command.ExecuteReader()) { while (sdr.Read()) { PName.Add(new SelectListItem { Text = sdr["PAR_DESC1"].ToString(), Value = sdr["PAR_CD"].ToString() }); } } // 无需手动调用connection.Close(),using会自动处理 } return PName; }
内容的提问来源于stack exchange,提问作者Mohan
相关产品推荐
相关产品推荐

