Как сбросить значение в раскрывающемся списке. NET Core Razor Pages - PullRequest
2 голосов
/ 04 марта 2020

Я новичок в целом. NET Основная вещь, я использовал ASP. NET 4 (формы) в течение многих лет. Я, вероятно, просто не могу думать правильно, или я упускаю что-то очевидное.

У меня есть 3 класса:

public class Rat {
    public int RatId { get; set; }
    public string Name { get; set; }
    public Color Color { get; set; }
    public int ColorId { get; set; }
    public ColorAddition ColorAddition {get;set;}
    public int? ColorAdditionId { get; set; }
    }
public class Color {
    public int ColorId { get; set; }
    public string Name { get; set; }
    public bool Addition { get; set; }
    }
public class ColorAddition {
    public int ColorAdditionId { get; set; }
    public string Name { get; set; }
 }

Каждая крыса должна иметь цвет и иметь добавление цвета. Некоторые цвета имеют цветовые дополнения (все цвета с цветными дополнениями имеют одинаковое подмножество цветовых дополнений). Если у крысы есть цвет с добавлением цвета, вам нужно указать это дополнение, в противном случае оно может быть нулевым.

Я создал CRUD для класса крысы. Вид обновления выглядит следующим образом:

<div class="row">
    <div class="col-md-4">
        <form method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <input type="hidden" asp-for="Rat.RatId" />
            <div class="form-group">
                <label asp-for="Rat.Name" class="control-label"></label>
                <input asp-for="Rat.Name" class="form-control" />
                <span asp-validation-for="Rat.Name" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Rat.ColorId" class="control-label"></label>
                <select asp-for="Rat.ColorId" class="form-control" asp-items="ViewBag.ColorId"></select>
                <span asp-validation-for="Rat.ColorId" class="text-danger"></span>
            </div>
            <div class="form-group">
                <div id="ColorAddition">
                        <label asp-for="Rat.ColorAdditionId" class="control-label"></label>
                        <select asp-for="Rat.ColorAdditionId" class="form-control" asp-items="ViewBag.ColorAdditionId">
                            <option  disabled selected>Zvolte</option>
                        </select>
                        <span asp-validation-for="Rat.ColorAdditionId" class="text-danger"></span>
               </div>
            </div>

Он состоит из двух списков выбора, один для цвета, другой для добавления цвета. Когда у цвета есть добавление цвета, я бы хотел отобразить список добавления цвета, иначе он должен быть скрыт. Поэтому я создал это в конце представления:

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
<script type="text/javascript">
    $('#Rat_ColorId').change(function () {
        var selectedColor = $("#Rat_ColorId").val();

        $.getJSON(`?handler=HaveColorAddition&id=${selectedColor}`, function (emp) {
            console.log(emp);
            if (emp == true)
            {
                $('#ColorAddition').show();

            }
            else
            {
                $('#ColorAddition').hide();
                $('#Rat_ColorAdditionId').val(null);

            }

        });
    });

</script>
}

Он вызывает Json, который возвращает значение true, если цвет имеет добавление цвета, и значение false, если нет:

public JsonResult OnGetHaveColorAddition(int id)
        {
            return new JsonResult(_context.Colors.Find(id).Addition);
        }

Пока все хорошо, это работает как задумано. Если я выбираю цвет без добавления цвета, список выбора добавления цвета скрыт и его значение равно нулю.

Беда в том, что если я обновлю форму сейчас, добавление цвета не будет пустым, но оно сохранится. предыдущее значение.

Пример: у меня есть синий цвет (с добавлением цвета светлый и темный) и черный цвет (без добавления цвета). Прямо сейчас цвет синий и дополнение светло. Я хочу изменить цвет на черный, поэтому я выбираю черный. Список выбора с добавлением скрыт сейчас и без значения. Как только я отправляю форму, цвет меняется на черный, но добавление остается светлым.

Код обновления выглядит следующим образом:

public async Task<IActionResult> OnPostAsync(int? id)
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }

        var ratToUpdate = await _context.Rats.FindAsync(id);

        if (ratToUpdate == null)
        {
            return NotFound();
        }

        if (await TryUpdateModelAsync<Rat>(
        ratToUpdate,
        "rat",
        r => r.Name, r =>r.ColorId, r => r.ColorAdditionId))
        {
            await _context.SaveChangesAsync();
            return RedirectToPage("./Index");
        }
        return Page();
    }

Что я делаю не так?

1 Ответ

0 голосов
/ 04 марта 2020

Когда вы отправляете данные в обработчик, вы просто отправляете идентификатор скорости на серверную часть и по-прежнему запрашивает базу данных на основе идентификатора:

var ratToUpdate = await _context.Rats.FindAsync(id);

Так что ColorAdditionId всегда тот, который сохранен в базе данных. Вы должны включить Rat.ColorAdditionId при публикации данных в обработчике OnPostAsync, чтобы серверная сторона могла обновлять ColorAdditionId и сохранять в базе данных, а также показывать новое значение после return RedirectToPage("./Index");, которое будет запрашивать базу данных, чтобы получить новейшее значение ,

Пожалуйста, обратитесь к документам ниже, чтобы узнать, как использовать формы на страницах бритвы:

https://www.learnrazorpages.com/razor-pages/forms

https://docs.microsoft.com/en-us/aspnet/core/razor-pages/?view=aspnetcore-3.1&tabs=visual-studio

...