我目前正在尝试使用ASP.NET Core 6 MVC、Entity Framework Core 6和npgsql开始一个新项目。
当我尝试添加一个具有外部标识的实体时,ModelState.IsValid
仍然返回 false - 因为模型没有展开外部实体。
基本上,我遵循官方文档:
- https://learn.microsoft.com/de-de/aspnet/core/data/ef-mvc/complex-data-model?view=aspnetcore-6.0
- https://learn.microsoft.com/de-de/aspnet/core/data/ef-mvc/update-related-data?view=aspnetcore-6.0
我的类看起来像:
namespace PV.Models
{
public class Fakultaet
{
[Key]
public int FakultaetID { get; set; }
[Required]
public string FakuName { get; set; }
}
public class Studiengang
{
[Key]
public int StudiengangID { get; set; }
[Required]
public string StudiengangName { get; set;}
[Required,ForeignKey("Fakultaet")]
public int FakultaetID { get; set; }
public Fakultaet Fakultaet { get; set; }
}
}
部分视图:
@model PV.Models.Studiengang
<tr>
<td>
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input asp-for="StudiengangName" class="form-control" />
<span asp-validation-for="StudiengangName" class="text-danger"></span>
</td>
<td>
<select asp-for="FakultaetID" class="form-control" asp-items="ViewBag.FakultaetId">
<option disabled="disabled" selected="selected" value="0">Bitte wählen...</option>
</select>
<span asp-validation-for="FakultaetID" class="text-danger"></span>
</td>
<td>
<input type="submit" value="Speichern" class="btn btn-outline-success btn-sm" id="btn-addinline-submit" />
<input type="reset" onClick="location.reload()" class="btn btn-outline-danger btn-sm" id="btn-addinline-abort" value="Abbrechen" />
</td>
</tr>
控制器:
namespace PV.Controllers
{
public class StudiengangController : Controller
{
private readonly PraktikumsKontext _context;
public StudiengangController(PraktikumsKontext ctx)
{
_context = ctx;
}
// --- snip ---
// GET: Student/Add
public IActionResult AddStudiengangInline()
{
ViewBag.FakultaetId = new SelectList(_context.Fakultaeten.AsNoTracking(), "FakultaetID", "FakuName");
return PartialView();
}
// POST: Student/Add
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> AddStudiengangInline([Bind("StudiengangName, FakultaetID")] Studiengang studiengang )
{
if (ModelState.IsValid)
{
_context.Add(studiengang);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
ViewData["FakultaetId"] = new SelectList(_context.Fakultaeten, "FakultaetID", "FakuName", studiengang.FakultaetID);
return PartialView(studiengang);
}
}
}
当我现在填写我的表单并且提交 StudiengangName=Test1234;FakultaetID=1
(当然,这个已经存在一个 ID = 1
的 Fakultaet
)时,我的模型看起来是这样的:
StudiengangID = 0
StudiengangName = "Test1234"
Fakultaet = null
FakultaetID = 1
因此,由于“Fakultaet”为空,
ModelState.IsValid
返回false
。在这里,我假设EF Core 6执行其操作并解析我正在引用的实体。
如果在检查模型是否有效之前添加以下代码片段,则似乎一切正常:
studiengang.Fakultaet =
_context.Fakultaeten.SingleOrDefault(stg => stg.FakultaetID == studiengang.FakultaetID);
ModelState.ClearValidationState(nameof(Fakultaet));
TryValidateModel(studiengang);
但这似乎是一个不太干净的解决方法,因为在.NET Core 3.1中几乎相同的设置并不需要这样做。
有人知道我可能错过了什么吗?
SingleOrDefault
已经是填充Fakultaet的工作解决方法。我想知道为什么要这样记录它,并且-在.NETcore 3.1中可以运行。 - rurcoasteagleSingleOrDefault
部分。尝试在导航属性Fakultaet
上添加[Required]
属性。(例如,the-instructor-navigation-property) - Brett Caswell