这是dotnet上的一个例子。github.com/dotnet..。 -我在net-6.0版本上工作
验证检查的结果是假的,因为类的导航属性参与了验证。我在net-5.0上实现了一个简单的实验--导航属性没有反映在结果中。但是也许我错了。
如何正确解决这个问题?
public class Course
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Display(Name = "Number")]
public int CourseID { get; set; }
[StringLength(50, MinimumLength = 3)]
public string Title { get; set; }
[Range(0, 5)]
public int Credits { get; set; }
public int DepartmentID { get; set; }
public Department Department { get; set; }
public ICollection<Enrollment> Enrollments { get; set; }
public ICollection<CourseAssignment> CourseAssignments { get; set; }
}CoursesController.cs
// POST: Courses/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(
[Bind("CourseID,Credits,DepartmentID,Title")] Course course)
{
if (ModelState.IsValid)
{
_context.Add(course);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
PopulateDepartmentsDropDownList(course.DepartmentID);
return View(course);
}验证结果

发布于 2022-02-03 13:22:51
我认为问题是一个新的可空特性net6。我强烈建议您删除它或在项目属性中进行注释。
<!--<Nullable>enable</Nullable>-->这是一个非常愚蠢的特征。你必须把所有的财产标记为可空,直到你生命的尽头。
public ICollection<CourseAssignment>? CourseAssignments { get; set; }而且IMHO从不在控制器动作参数中使用bind。你总是会有问题的。它只在剃须刀页有用,但在非常罕见的情况下。在非常罕见的情况下使用Dto。当我必须从联接中创建大多数属性时,我通常只将Dto用于select。
发布于 2022-02-03 09:28:39
不知道这能不能回答你的问题。但是建议您创建一个 数据传输对象(DTO) 类,而不是直接使用(生成的)数据库对象类。
DTO类是根据预期接收的值(模式) API设计的。而且这个DTO类还将用于进行一级数据验证,如Required、Range等(不涉及对数据库的验证)。
public class CreateCourseDto
{
[Display(Name = "Number")]
public int CourseID { get; set; }
[StringLength(50, MinimumLength = 3)]
public string Title { get; set; }
[Range(0, 5)]
public int Credits { get; set; }
public int DepartmentID { get; set; }
}然后,只将DTO的值绑定到实际的DB对象。手动绑定/赋值或应用工具/库(如AutoMapper )。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(
[Bind("CourseID,Credits,DepartmentID,Title")] CreateCourseDto course)
{
if (ModelState.IsValid)
{
// Map received course value to DB object
Course _course = new Course
{
CourseID = course.CourseID,
Title = course.Title,
Credits = course.Credits,
DepartmentID = course.DepartmentID
};
_context.Add(_course);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
PopulateDepartmentsDropDownList(course.DepartmentID);
return View(course);
}https://stackoverflow.com/questions/70966537
复制相似问题