ModelState.isValid()== False + Required-notation

时间:2018-04-16 14:44:08

标签: c# asp.net-mvc asp.net-identity modelstate

我正在为我的项目使用Identity框架,并在JobExperience类中添加了一些属性,例如User

用户应该可以在JobExperience添加User。当然,这意味着JobExperience不能在没有User的情况下存在。

因此我在JobExperience

中使用[必需]注释

JobExperience class

public class JobExperience
{
    public int JobExperienceId { get; set; }
    public string Employer { get; set; }
    public DateTime? DateOfEmployment { get; set; }
    public DateTime? DateOfExit { get; set; }
    public ICollection<Subject> Subjects { get; set; }
    [Required]
    public virtual User ApplicationUser { get; set; }
}

用户类

public class User : IdentityUser
{
    public Boolean Available { get; set; }
    public Boolean ActivelySeeking { get; set; }
    public Boolean AcceptedUseOfData { get; set; }
    public int ExpectedHourlySalary { get; set;}
    public Boolean Gender { get; set;}
    public DateTime? DateOfBirth { get; set; }
    public String FirstName { get; set; }
    public string LastName { get; set; }
    public ICollection<JobExperience> JobExperiences { get; set; }
    public ICollection<Language> Languages { get; set; }
    public ICollection<Certificate> Certificates { get; set; }
}

Scaffolded JobExperienceController - 创建方法

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "JobExperienceId,Employer,DateOfEmployment,DateOfExit")] JobExperience jobExperience)
{
    var UserId = User.Identity.GetUserId();
    jobExperience.ApplicationUser = db.Users.Where(x => x.Id == UserId).First();

    if (ModelState.IsValid)
    {
       db.JobExperiences.Add(jobExperience);
       db.SaveChanges();
       return RedirectToAction("Index");
    }

    return View(jobExperience);
}

添加了Required-notation后,create方法中的modelstate.isValid()返回false。我猜它需要收到对用户的引用,但我不知道如何去做。当前的尝试是显示的LINQ表达式。

ApplicationUserDb

 public class ApplicationUserDb : IdentityDbContext<User>
{

    public virtual DbSet<JobExperience> JobExperiences { get; set; }
    public virtual DbSet<Language> Languages { get; set; }
    public virtual DbSet<Certificate> Certificates { get; set; }

    public ApplicationUserDb() : base("DefaultConnection")
    {

    }

    internal static ApplicationUserDb Create()
    {
        return new ApplicationUserDb();
    }

}

1 个答案:

答案 0 :(得分:2)

您希望对function validate(id) { var valid = false; try { if(id == new mongoose.Types.ObjectId(""+id)) valid = true; } catch(e) { valid = false; } return valid; } > validate(null) false > validate(20) false > validate("abcdef") false > validate("5ad72b594c897c7c38b2bf71") true &lt; - &gt;之间的关系进行建模。 User为1(必填)&lt; - &gt; 0-N(可选列表)。您不会通过将ApplicationUser标记为JobExperience来实现此目的。而是在[Required]中配置多重性约束并删除ModelBuilder属性。

[Required]

教程:Configure One-to-Many Relationships in EF 6

另外请注意,您应该引入ViewModels,而不是将实体模型绑定到控制器。这样,您就不会混合用于前端验证的注释(例如ModelBuilder.Entity<User>() .HasMany(u => u.JobExperiences) .WithRequired(j => j.ApplicationUser) .WillCascadeOnDelete(true); )和用于数据持久性的注释(例如[Required])。

如果[ForeignKey]继承自User,请确保在模型构建器中调用IdentityUser(请参阅EntityType 'IdentityUserLogin' has no key defined. Define the key for this EntityType )。