传递空值

Passing a null value

任何建议都会很棒!

我的 ClassID 总是得到空值。当我添加断点时,我可以看到值 ClassID 被正确传递,但是当我的程序返回以获取我创建的列表时,在进入该特定断点后 ClassID returns null。我相信我的问题出在我的控制器上,但我似乎找不到问题所在。

这是我的数据库文件。第一个数据集从存储过程中检索我的 ClassID,我的列表下面是 returns 特定 ClassID

中的学生
public DataSet GetClass(string ClassID)

    {
        ClassModel classes = new ClassModel();
        SqlCommand com = new SqlCommand("sp_ABEAttendanceEnrollment", ABEAttendanceDB);
        com.CommandType = CommandType.StoredProcedure;
        com.Parameters.AddWithValue("@ClassID", ClassID);
        SqlDataAdapter da = new SqlDataAdapter(com);
        DataSet ds1 = new DataSet();
        da.Fill(ds1);
        return ds1;
    }
    public IEnumerable<ClassModel> ClassModel
    {
        get
        {
            string connectionString = ConfigurationManager.ConnectionStrings["ABEAttendanceDB"].ConnectionString;
            List<ClassModel> students = new List<ClassModel>();
            using (SqlConnection con = new SqlConnection(connectionString))
            {
                ClassModel classes = new ClassModel();
                SqlCommand cmd = new SqlCommand("sp_ABEAttendanceEnrollment", ABEAttendanceDB);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@ClassID", classes.ClassID);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataSet ds1 = new DataSet();
                da.Fill(ds1);
                ABEAttendanceDB.Open();
                SqlDataReader rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    ClassModel student = new ClassModel();

                    student.ClassID = rdr["ClassID"].ToString();
                    student.SID = rdr["SID"].ToString();
                    student.FullName = rdr["FullName"].ToString();
                    students.Add(student);
                }
                ABEAttendanceDB.Close();
                return students;
            }
        }

    }

这是我的控制器

public class ClassController : Controller
{

    DAL.DB dblayer = new DAL.DB();

    public ActionResult Class(ClassModel ClassModel)
    {

        DataSet ds1 = dblayer.GetClass(ClassModel.ClassID);
        ViewBag.general = ds1.Tables;

        ViewBag.Message = TempData["Message"];
        DB classes = new DB();
        List<ClassModel> students = dblayer.ClassModel.ToList();

        return View();
    }


}   

你的DAL代码有点奇怪。当然 GetClass 方法应该 return IEnumerable<ClassModel>?否则看起来你最终无缘无故地执行了两次 sp_ABEAttendanceEnrollment 。至少可以说,将 SQL 查询放在 getter 中是相当不寻常的。还不清楚为什么您需要两份数据副本(一份作为 DataTable 的集合,通过 ViewBag.general,一份作为 List<ClassModel>,通过 students 变量。

我不确定您的 DAL class 是否需要 ClassModel 属性。只需让 GetClass 方法直接将数据读取到 IEnumerable<Class> 中,然后 return 将其发送到控制器即可。然后你可以 return 学生列表到控制器作为你的视图的模型,像这样:

达尔:

public List<ClassModel> GetClass(string ClassID)
{
    List<ClassModel> students = new List<ClassModel>();
    SqlCommand cmd = new SqlCommand("sp_ABEAttendanceEnrollment", ABEAttendanceDB);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@ClassID", ClassID);
    ABEAttendanceDB.Open();
    SqlDataReader rdr = cmd.ExecuteReader();

    while (rdr.Read())
    {
        ClassModel student = new ClassModel();
        student.ClassID = rdr["ClassID"].ToString();
        student.SID = rdr["SID"].ToString();
        student.FullName = rdr["FullName"].ToString();
        students.Add(student);
    }

    ABEAttendanceDB.Close();
    return students;
}

控制器:

public class ClassController : Controller
{
    DAL.DB dblayer = new DAL.DB();

    public ActionResult Class(ClassModel ClassModel)
    {
        ViewBag.Message = TempData["Message"];
        List<ClassModel> students = dblayer.getClass(ClassModel.ClassID);

        return View(students);
    }
}

视图将开始于:

@model List<ClassModel>