You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MVC中Action返回视图与列表绑定失败问题求助

嘿,我帮你排查下这个问题,你遇到的错误根源是数据传递和视图Model的类型不匹配,还有视图里对Model的访问方式不对,咱们一步步来修复:

问题分析

  1. 你的Action方法返回的是Detail.PlantName.ToList()(也就是List<SelectListItem>类型),但视图声明的Model是IList<FormData>——这俩类型完全不匹配,所以视图会报错“List不包含PlantName的定义”,因为List本身没有这个属性,只有FormData对象才有。
  2. 就算类型匹配,视图里直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:19:22