控制器没有从模型获取ID,返回null

时间:2017-06-20 17:03:25

标签: c# asp.net asp.net-mvc asp.net-mvc-5

在我看来,我有一张记录表(汽车)和一个编辑'按钮,它在我的控制器中转到我的Edit actionresult方法。

然后我在我的控制器中有这个代码:

 public ActionResult Edit(int? ID, Search sobj)
    {
        //CarRepository car = new CarRepository();
        sobj.carrepos = new CarRepository();

        if (ID.HasValue)
        {
            sobj.carrepos.populateStatusList();
            sobj.carrepos.getCarToUpdate(ID);

            //sobj.carrepos.ID = ID;

            return View("Edit", sobj);
        }
        else
        {
            sobj.carrepos.populateStatusList();
            return View("Edit", sobj);
        }           
    }

在我的搜索模型中,我有一个CarRepository类的实例,我可以访问它的方法/数据。在这个问题中,ID为null,位于CarRepository类中。

这就是它的样子(我已经删除了很多不需要看的代码:

    public class Search
{

    public CarRepository carrepos { get; set; }

    public Search() {}

}

当ID.HasValue(我点击'编辑'记录时)传入时,例如49,sobj.carrepos.getCarToUpdate(ID);运行并获取指定ID的汽车详细信息。

这是我的CarRepository类中的代码:

public void getCarToUpdate(int? ID)
    {
        try
        {
            if (dbConn.State != ConnectionState.Open)
            {
                dbConn.Open();
                MySqlCommand cmd = new MySqlCommand();

                cmd.Connection = dbConn;
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = "SELECT ID, carMake, carModel, engine, deleteStatus FROM myprojectdb WHERE ID = ?ID";

                cmd.Parameters.Add("?ID", MySqlDbType.Int16).Value = ID;
                MySqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        ID = (int)reader[0];
                        carMake = (string)reader[1];
                        carModel = (string)reader[2];
                        Engine = (string)reader[3];
                        deleteStatus = (string)reader[4];
                    }
                }
                reader.Close();
                dbConn.Close();

            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }

        dbConn.Close();

    }

当我在这个位置放置一个断点时:

return View("Edit", sobj);

并查看sobj的属性,ID = null

仅当我添加以下代码时才会这样:

sobj.carrepos.ID = ID;

它再次开始工作,是的,我明白为什么但不确定为什么它丢失了ID值,SQL查询在获取所有数据时工作正常。

以下是我在视图中使用它的方式:

@Html.HiddenFor(model => model.carrepos.ID)

其余代码是样板代码。

希望这是有道理的!

1 个答案:

答案 0 :(得分:1)

您要测试的ID不是对象的一部分。 carrepos.ID为空,因为您正在第一个可执行行sobj.carrepos = new CarRepository();中创建对象。此时,它的所有属性都为null。

您可以通过sobj.carrepos = new CarRepository { ID = ID};这样的方式创建它,并且应该修复它

<强>更新

在查看更新后的问题之后,我会说问题是您的参数ID正在影响您的属性ID,因此该属性永远不会被设置。您可以通过两种方式之一解决它

// Fully qualify your property
this.ID = (int)reader[0];

或者重新定义这样的论点

public void getCarToUpdate(int? id)
{
    try
    {
        if (dbConn.State != ConnectionState.Open)
        {
            dbConn.Open();
            MySqlCommand cmd = new MySqlCommand();

            cmd.Connection = dbConn;
            cmd.CommandType = System.Data.CommandType.Text;
            cmd.CommandText = "SELECT ID, carMake, carModel, engine, deleteStatus FROM myprojectdb WHERE ID = ?ID";

            cmd.Parameters.Add("?ID", MySqlDbType.Int16).Value = id;
            MySqlDataReader reader = cmd.ExecuteReader();

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    ID = (int)reader[0];
                    carMake = (string)reader[1];
                    carModel = (string)reader[2];
                    Engine = (string)reader[3];
                    deleteStatus = (string)reader[4];
                }
            }
            reader.Close();
            dbConn.Close();

        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }

    dbConn.Close();

}

请注意,我已将参数更改为小id,这样就可以在方法中看到该属性。

相关问题