Контроллер не получает идентификатор из модели, возвращая ноль
На мой взгляд, у меня есть таблица рекордов (автомобили) и кнопка "Редактировать", которая переходит к моему методу 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, к которому я могу получить доступ к его методам / данным. В этом вопросе идентификатор с нулевым значением находится в классе CarRepository.
Вот как это выглядит (я удалил много кода, который не нужно видеть:
public class Search
{
public CarRepository carrepos { get; set; }
public Search() {}
}
Когда ID.HasValue (передается, когда я нажимаю "Изменить" для записи), например, для 49, sobj.carrepos.getCarToUpdate(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;
Он снова начинает работать, и да, я понимаю, почему, но не уверен, почему он теряет значение идентификатора, SQL-запрос отлично работает при извлечении всех данных.
Вот как я это использую:
@Html.HiddenFor(model => model.carrepos.ID)
Остальная часть кода является стандартным кодом.
Надеюсь, что это имеет смысл!
1 ответ
Идентификатор, который вы проверяете, не является частью объекта. carrepos.ID
является нулевым, потому что вы создаете объект в вашей первой исполняемой строке sobj.carrepos = new CarRepository();
, На данный момент все его свойства нулевые.
Вы можете создать это таким образом sobj.carrepos = new CarRepository { ID = ID};
и это должно это исправить
Обновить
Посмотрев на ваш обновленный вопрос, я бы сказал, что проблема в том, что ваш параметр ID
следит за вашей собственностью ID
и, таким образом, свойство никогда не устанавливается. Вы можете решить это одним из 2 способов
// 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
и таким образом свойство может быть видно из метода.