Razor ASP.NET Ядро: Почему статус подключения к базе данных показывает «Подключение» при первой загрузке, а затем при перезагрузке успешно подключается к базе данных?

#asp.net-mvc #asp.net-core #razor #razor-pages

#asp.net-mvc #asp.net-core #razor #razor-страницы

Вопрос:

Я создаю веб-приложение, используя ASP.NET Ядро 3.1 MVC и страницы Razor.

Я новичок в Razor pages.

Я создал страницу регистрации, содержащую следующие два поля —

  1. Имя пользователя (тип элемента управления — текстовое поле)
  2. Страна пользователя (тип элемента управления — выпадающий список)

Есть кнопка — «Зарегистрироваться»

При запуске приложения страница razor загружается, но выпадающий список Country пуст.

При обновлении / перезагрузке той же страницы выпадающий список стран заполняется списком стран из базы данных.

При отладке я обнаружил, что при первом запуске статус подключения к базе данных показывает «Connecting» и выдается исключение «ExecuteReader требует открытого и доступного подключения. Текущее состояние соединения — connecting «.

Когда та же страница обновляется / перезагружается, статус подключения к базе данных показывает «Подключено», а выпадающий список country получает значения.

Вопрос:
Почему подключение к базе данных показывает «Подключение» при первой загрузке страницы razor, а затем та же страница успешно подключается к базе данных при обновлении / перезагрузке?

Ниже приведены фрагменты кода для справки:

Register.cshtml

         <div class="form-group row">
            <label asp-for="@Model.UserCountry" class="col-sm-2 col-form-label"></label>
            <div class="col-sm-10">
                <select asp-for="CountryId" asp-items="@Model.UserCountry">
                    <option value=""></option>
                </select>
                <span asp-validation-for="@Model.UserCountry" class="text-danger"></span>
            </div>
        </div>
  

Register.cshtml.cs

         //
        [BindProperty]
        public int CountryId { get; set; }


        //Model definition    
        [BindProperty]
        [Required(ErrorMessage = "Country is required")]
        [Display(Name = "Country")]
        public List<SelectListItem> UserCountry
        {
            get
            {
                return FillList();
            }
        }

        //FillList retrieves country list from database
        public List<SelectListItem> FillList()
        {
            var list = new List<SelectListItem>();
            DataTable dtTableResult = new DataTable();
            try
            {
                objappdbcont = new AppDbContext();
                objappdbcont.ConnectionString = _configuration.GetSection("ConnectionStrings").GetSection("DefaultConnection").Value;
                dtTableResult = objappdbcont.GetLists();
                    foreach (DataRow row in dtTableResult.Rows)
                    {
                        list.Add(new SelectListItem { Value = row[0].ToString(), Text = row[1].ToString() });
                    }

            }
            catch (Exception ex)
            {
                list.Add(new SelectListItem { Value = "0", Text = ex.Message.ToString() });
            }

            return list;
        }

  

AppDBContect.cs

     public DataTable GetLists()
    {

        SqlDataAdapter myAdapter = new SqlDataAdapter();
        DataSet myDataset = new DataSet();
        SqlDataReader myDataReader;
        DataTable dtTableResult = new DataTable();
        string strConnString = "";
        string storedprocname = "spGetCountries";
        
        try
        {
            strConnString = ConnectionString;

            using (SqlConnection connSrc1 = new SqlConnection(strConnString))
            {
                using (SqlCommand command = new SqlCommand())
                {
                    myAdapter = new System.Data.SqlClient.SqlDataAdapter();
                    command.Connection = connSrc1;
                    command.CommandType = CommandType.StoredProcedure;
                    command.CommandTimeout = 0;
                    command.CommandText = storedprocname;
                    connSrc1.OpenAsync();
                    myDataReader = command.ExecuteReader();
                    dtTableResult.Load(myDataReader);
                    connSrc1.DisposeAsync();
                }
            }
        }
        catch (Exception ex)
        {
            var errmsg = ex.Message;
        }

        return dtTableResu<
    }
  

Комментарии:

1. В вашем коде есть несколько проблем. Когда вы сталкиваетесь с проблемами, начните с чего-то более простого. Пропустите db-stuff и посмотрите, сможете ли вы заставить его работать с жестко заданными странами в качестве доказательства концепции. Удачи!

2. Я исправил ошибку во фрагменте кода. Сначала я проверил код с помощью жестко заданного списка стран. Позже я добавил код подключения к базе данных.

Ответ №1:

Проблема решается с помощью connSrc1.Open() и «connSrc1.Dispose()» вместо connSrc1.OpenAsync() и «connSrc1.DisposeAsync()» соответственно в функции GetLists() в AppDBContect.cs.