#c# #asp.net-core #select #razor-pages
#c# #asp.net-core #выберите #razor-страницы
Вопрос:
Я создаю приложение в Razor, которое поддерживает команду QA в моей компании. Цель состоит в том, чтобы зарезервировать тесты (называемые потоками) для выполнения членами команды. Я новичок в программировании, и я столкнулся с проблемой, которую не могу решить: (
OnGet — я получаю список тестов из базы данных (с именами тестов и идентификаторами тестов). Я также получаю список тестировщиков из другой таблицы и использую этот список для заполнения выпадающих списков в приложении (поэтому я отображаю имена тестировщиков вместо идентификаторов тестов). Это работает нормально.
OnPost — я хотел бы обновлять базу данных, когда кто-то изменяет раскрывающиеся значения (либо onChange, либо с помощью кнопки отправки). Я пробовал два варианта, но ни один из них не работает. Я вставлю приведенный ниже код, но давайте пока просто предположим, что у меня есть два тестировщика в БД: Id = 1, Name= Tester1 и Id = 2, Name = Tetser2. У меня также есть один тест в другой таблице, который назначен тестеру Id = 1. Я хочу изменить его на Id = 2.
Модель:
[BindProperty]
public List<Thread> Threads { get; set; }
[BindProperty]
public List<Tester> Testers { get; set; }
public int ThreadsCounter { get; set; }
public int TestersCounter { get; set; }
public void OnGet()
{
DataAccess db = new DataAccess();
Threads = db.GetThreads();
ThreadsCounter = Threads.Count;
Testers = db.GetTesters();
TestersCounter = Testers.Count;
}
public void OnPost()
{
DataAccess db = new DataAccess();
db.UpdateThread(Threads);
}
Вариант 1 (выбор html):
<div>
<table class="thread-table">
<thead>
<tr>
<th>Id</th>
<th>Test name</th>
<th>Data check tester</th>
</tr>
</thead>
<tbody>
@for (int i = 0; i < @Model.ThreadsCounter; i )
{
<tr>
<td>@Model.Threads[i].Id</td>
<td>@Model.Threads[i].ThreadNumber</td>
<td>
<select name="dataTester-@i">
@if (Model.Threads[i].DataCheckTesterId == 0)
{
<option>--select--</option>
}
@for (int j = 0; j < @Model.TestersCounter; j )
{
if (Model.Testers[j].Id == Model.Threads[i].DataCheckTesterId)
{
<option value="@Model.Testers[j].TesterName" selected>@Model.Testers[j].TesterName</option>
}
else
{
<option value="@Model.Testers[j].TesterName">@Model.Testers[j].TesterName</option>
}
}
</select>
</td>
</tr>
}
</tbody>
</table>
</div>
Когда я использую выпадающий список для изменения тестера, и я отправляю в форму значение, которое передается модели.Потоки [i].DataCheckTesterId (идентификатор тестировщика) не меняется. Итак, если я хочу изменить Tester1 на Tester2, я все равно передаю ID = 1, и изменений нет.
Вариант 2 (Html.DropDownList) — я знаю, что это правильный путь, но пока результат еще хуже:
<div>
<form method="post">
<table class="thread-table">
<thead>
<tr>
<th>Id</th>
<th>Test name</th>
<th>Data check tester</th>
</tr>
</thead>
<tbody>
@foreach (var thread in Model.Threads)
{
<tr>
<td>
<input type="hidden" name="Threads.Index" value="@thread.Id" />
<input type="hidden" name="Threads[@thread.Id].Id" value="@thread.Id" />
@thread.Id
</td>
<td>@thread.ThreadNumber</td>
<td>
<input type="hidden" name="Threads[@thread.DataCheckTesterId].Id" value="@thread.DataCheckTesterId" />
@Html.DropDownList("TestersList", new SelectList(Model.Testers, "Id", "TesterName", thread.DataCheckTesterId), "Select")
</td>
</tr>
}
</tbody>
</table>
<br />
<button>Update</button>
</form>
Когда я меняю тестер и отправляю, значение, которое передается как Id = 0.
Я совсем запутался в том, что здесь происходит, но я подозреваю, что это вызвано тем, что 2 свойства (тесты и тестировщики) мешают друг другу. Я был бы очень признателен за толчок в правильном направлении 🙂
Ответ №1:
Я внес некоторые изменения, вы можете обратиться к приведенным ниже кодам:
Модель:
public class Thread
{
public int Id { get; set; }
public string ThreadName { get; set; }
public int DataCheckTesterId { get; set; }
}
public class Tester
{
public int Id { get; set; }
public string TesterName { get; set; }
}
Вид:
@{
var count = 0;
}
<form method="post">
<table class="thread-table">
<thead>
<tr>
<th>Id</th>
<th>Test name</th>
<th>Data check tester</th>
</tr>
</thead>
<tbody>
@foreach (var thread in Model.Threads)
{
<tr>
<td>
<input type="hidden" name="Threads[@count].Id" value="@thread.Id" />
@thread.Id
</td>
<td>
<input type="hidden" name="Threads[@count].ThreadName" value="@thread.ThreadName" />
@thread.ThreadName
</td>
<td>
@Html.DropDownList("Threads[" count "].DataCheckTesterId", new SelectList(Model.Testers, "Id", "TesterName", thread.DataCheckTesterId), "Select")
</td>
</tr>
count ;
}
</tbody>
</table>
<br />
<button>Update</button>
</form>
Контроллер:
[BindProperty]
public List<Thread> Threads { get; set; }
[BindProperty]
public List<Tester> Testers { get; set; }
public int ThreadsCounter { get; set; }
public int TestersCounter { get; set; }
public void OnGet()
{
Threads = new List<Thread>
{
new Thread{ Id = 1, ThreadName = "Tester1", DataCheckTesterId = 0},
new Thread{ Id = 2, ThreadName = "Tester2", DataCheckTesterId = 0},
new Thread{ Id = 3, ThreadName = "Tester3", DataCheckTesterId = 0},
};
Testers = new List<Tester>
{
new Tester{ Id = 1, TesterName = "AA"},
new Tester{ Id = 2, TesterName = "BB"},
new Tester{ Id = 3, TesterName = "CC"},
};
}
public void OnPost()
{
}
Результат: