Как связать 2 свойства вместе на страницах Razor?

#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()
{

}
 

Результат:

введите описание изображения здесь