代码之家  ›  专栏  ›  技术社区  ›  cruzz

验证错误asp core-字段是必需的

  •  1
  • cruzz  · 技术社区  · 2 年前

    我正在研究一个项目,它由一个小型的ASP.NET Core 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)... 它工作正常,但如果我尝试验证,它不会将其保存在数据库中,也不会返回任何错误。我被卡住了。我使用得到错误输出

    System.Console.WriteLine(message)
    

    错误:

    部门字段是必填字段。

    1 回复  |  直到 2 年前
        1
  •  0
  •   Qing Guo    2 年前

    你可以尝试添加 ? 手动喜欢:

    public Department? Department {get; set;}
    

    或: 您可以删除 <Nullable>enable</Nullable> 从项目文件中(双击项目名称或右键单击项目以选择“编辑项目文件”)。你可以阅读 this 了解更多。