【发布时间】:2020-06-16 09:07:15
【问题描述】:
我是整个 .NET Core 的新手,我使用 ASP.NET 4 (Forms) 已经很多年了。我可能只是无法正确思考,或者我错过了一些明显的东西。
我有 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);
}
到目前为止一切顺利,这正在按预期工作。如果我选择不加颜色的颜色,加颜色选择列表是隐藏的,它的值为null。
麻烦的是,如果我现在更新表单,颜色添加不是空的,而是保持之前的值。
示例:我有蓝色(添加了浅色和深色)和黑色(没有添加颜色)。现在颜色是蓝色,添加是浅色的。我想把颜色改成黑色,所以我选择黑色。带有添加的选择列表现在被隐藏并且没有值。提交表单后,颜色变为黑色,但添加仍然很亮。
更新代码如下所示:
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();
}
我做错了什么?
【问题讨论】: