在我看来,我有一张记录表(汽车)和一个编辑'按钮,它在我的控制器中转到我的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)
其余代码是样板代码。
希望这是有道理的!
答案 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
,这样就可以在方法中看到该属性。