Я новичок в целом. 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();
}
Что я делаю не так?