首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ModelState.IsValid包含一个导航属性。总是假的。(只有net-6.0)如何得到真实?

ModelState.IsValid包含一个导航属性。总是假的。(只有net-6.0)如何得到真实?
EN

Stack Overflow用户
提问于 2022-02-03 05:57:10
回答 2查看 438关注 0票数 2

这是dotnet上的一个例子。github.com/dotnet..。 -我在net-6.0版本上工作

验证检查的结果是假的,因为类的导航属性参与了验证。我在net-5.0上实现了一个简单的实验--导航属性没有反映在结果中。但是也许我错了。

如何正确解决这个问题?

代码语言:javascript
复制
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

代码语言:javascript
复制
// 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);
}

验证结果

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-03 13:22:51

我认为问题是一个新的可空特性net6。我强烈建议您删除它或在项目属性中进行注释。

代码语言:javascript
复制
 <!--<Nullable>enable</Nullable>-->

这是一个非常愚蠢的特征。你必须把所有的财产标记为可空,直到你生命的尽头。

代码语言:javascript
复制
public ICollection<CourseAssignment>? CourseAssignments { get; set; }

而且IMHO从不在控制器动作参数中使用bind。你总是会有问题的。它只在剃须刀页有用,但在非常罕见的情况下。在非常罕见的情况下使用Dto。当我必须从联接中创建大多数属性时,我通常只将Dto用于select。

票数 3
EN

Stack Overflow用户

发布于 2022-02-03 09:28:39

不知道这能不能回答你的问题。但是建议您创建一个 数据传输对象(DTO) ,而不是直接使用(生成的)数据库对象类。

DTO类是根据预期接收的值(模式) API设计的。而且这个DTO类还将用于进行一级数据验证,如Required、Range等(不涉及对数据库的验证)。

代码语言:javascript
复制
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 )。

代码语言:javascript
复制
[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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70966537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档