我有一个我正在研究的项目,它由一个小的ASP.NET核心MVC应用程序组成.

我遵循了课程,然而,视频中使用的版本是2.1,我有5,6,7.

误差由ModelState.IsValid组成.问题是我的create.cshtml表单需要一个我在表单中没有的字段.我有DepartmentId字段,但它要求Department字段.

我的课程和错误:

Seller.cs:

using System.ComponentModel.DataAnnotations;

namespace LojaWebMvc.Models;

public class Seller
{
    public int Id { get; set; }
    [Required(ErrorMessage ="{0} required")]
    [StringLength(60, MinimumLength = 3, ErrorMessage ="{0} size shold be between {2} and {1}")]
    public string Name { get; set; }

    [Required(ErrorMessage ="{0} required")]
    [EmailAddress(ErrorMessage = "Enter a valid email")]
    public string Email { get; set; }

    [Display(Name="Birth Date")]
    [DataType(DataType.Date)]
    [Required(ErrorMessage ="{0} required")]
    public DateTime BirthDate { get; set; }
 
    [Display(Name = "Base Salary")]
    [DisplayFormat(DataFormatString ="{0:F2}")]
    [Required(ErrorMessage ="{0} required")]
    [Range(100.0, 5000.0, ErrorMessage ="{0} must be from {1} to {2}")]
    public double BaseSalary { get; set; }

    public Department Department {get; set;}
    public int DepartmentId { get; set; }

    public ICollection<SalesRecord> Sales {get; set;} = new List<SalesRecord>();

    public Seller()
    {
    }

    public Seller(int id, string name, string email, DateTime birthdate, double salary, Department department)
    {
        Id = id;
        Name = name;
        Email = email;
        BirthDate = birthdate;
        BaseSalary = salary;
        Department = department;
    }

    public void AddSales(SalesRecord sr)
    {
        Sales.Add(sr);
    }

    public void RemoveSales(SalesRecord sr)
    {
        Sales.Remove(sr);
    }

    public double TotalSales(DateTime initial, DateTime final)
    {
        return Sales.Where(sr => sr.Date >= initial && sr.Date <= final).Sum(sr => sr.Amount);
    }
}

Department.cs:

namespace LojaWebMvc.Models;

public class Department
{
    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<Seller> Sellers { get; set; } = new List<Seller>();

    public Department()
    {
    }

    public Department(int id, string name)
    {
        Id = id;
        Name = name;
    }

    public void AddSeller(Seller seller)
    {
        Sellers.Add(seller);
    }

    public double TotalSales(DateTime initial, DateTime final)
    {
        return Sellers.Sum(seller => seller.TotalSales(initial, final));
    }
}

部门服务FindAll:

...
public List<Department> FindAll()
{
    //return _vsproContext.Department.OrderBy(x => x.Name).ToList();
    var list = _vsproContext.Department;
    var obj = new List<Department>();

    obj = list.Select(x => new Department(
        x.Id,
        x.Name  
    )).ToList();

    return obj;
}
...

SellerService:

using LojaWebMvc.Models;
using LojaWebMvc.Services.Interfaces;
using LojaWebMvc.Data;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using LojaWebMvc.Services.Exceptions;

namespace LojaWebMvc.Services;

public class SellerService: ISellerService
{
    private readonly VsproContext _vsproContext;

    public SellerService(VsproContext vsproContext)
    {
        _vsproContext = vsproContext;
    }

    //

    public List<Seller> FindAll()
    {
        // return _vsproContext.Seller.OrderBy(x => x.Name).ToList();
        var list = _vsproContext.Seller;
        var obj = list.Select(x => new Seller(x.Id, x.Name,
                x.Email, x.BirthDate, x.BaseSalary, x.Department)).ToList();
        return obj;
    }

    public Seller FindById(int id)
    {
        return _vsproContext.Seller.Include(obj => obj.Department).FirstOrDefault(x => x.Id == id);
        // var obj = _vsproContext.Seller.Find(id);
        // return obj;
    }

    public Seller Insert(Seller seller)
    {
        _vsproContext.Add(seller);
        _vsproContext.SaveChanges();
        return seller;
    }

    public void Remove(int id)
    {
        var obj = _vsproContext.Seller.Find(id);
        _vsproContext.Remove(obj);
        _vsproContext.SaveChanges();
    }

    public void Update(Seller seller)
    {
        if (!_vsproContext.Seller.Any(x => x.Id == seller.Id))
        {
            throw new NotFoundException("Error - Id not found");
        }

        try
        {
            _vsproContext.Update(seller);
            _vsproContext.SaveChanges();
         }
         catch(DbUpdateConcurrencyException e) 
         {
             throw new DbConcurrencyException(e.Message);
         }
    }
}

控制器:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(Seller seller)
{
    if (!ModelState.IsValid)
    {
        var message = string.Join(" | ", ModelState.Values
                            .SelectMany(v => v.Errors)
                            .Select(e => e.ErrorMessage));
        System.Console.WriteLine(ModelState.Values);

        var departments = _departmentService.FindAll();
        var viewModel = new SellerFormViewModel{ Seller = seller, Departments = departments};
        System.Console.WriteLine(message);

        return View("Create", viewModel);
    }
         
    _sellerService.Insert(seller);
    return RedirectToAction("Index");
}

如果你删除if(!ModelState.Isvalid)...,它会正常工作,但如果我try 验证,它不会将其保存在数据库中,也不会返回任何错误.我被卡住了.我得到的错误输出使用

System.Console.WriteLine(message)

错误:

部门字段为必填项.

推荐答案

您可以try 添加?个男子汉来点赞:

public Department? Department {get; set;}

一百零二 您可以从项目文件中删除<Nullable>enable</Nullable>(双击项目名称或右键单击项目以 Select 编辑项目文件).你可以阅读this页来了解更多.

Csharp相关问答推荐

更新数据库中的对象失败,原因是:Microsoft. EntityFrame Core. GbUpdateConcurrencyResponse'

使用C#中的Shape API从Azure目录获取所有用户

在具有主构造函数的类中初始化属性时出现警告

使页面内容居中

如何将此方法参数化并使其更灵活?

C#-VS2022:全局使用和保存时的代码清理

在两个已具有一对多关系的表之间添加另一个一对多关系

在Docker容器中运行API项目时,无法本地浏览到index.html

GODOT 4向C#中的字符串参数发送信号以等待

WinUI 3中DoubleCollection崩溃应用程序类型的依赖属性

使用switch 类型模式时出现奇怪的编译器行为

获取混淆&Quot;模糊引用&Quot;错误

从HTML元素获取 colored颜色

Xamarin.Forms中具有类似AspectFill的图像zoom 的水平滚动视图

最小API定义的Swagger标头参数

如何使ExecuteAsync异步运行

无法将.Net Framework 4.8.1升级到.Net 7

我应该使用IMhemyCache来存储承载令牌,还是应该为Azure函数中的401个错误实施Polly重试策略?

MS Project读取项目自定义域

阻止CLR释放已封送的双字符指针的内存?