Контроллер не получает идентификатор из модели, возвращая ноль

На мой взгляд, у меня есть таблица рекордов (автомобили) и кнопка "Редактировать", которая переходит к моему методу 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 и таким образом свойство может быть видно из метода.

Другие вопросы по тегам