#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.
Я создал страницу регистрации, содержащую следующие два поля —
- Имя пользователя (тип элемента управления — текстовое поле)
- Страна пользователя (тип элемента управления — выпадающий список)
Есть кнопка — «Зарегистрироваться»
При запуске приложения страница 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.