2016-06-22 24 views
0

概要「フィールドが必要です」と言う:ASP.NET MVC:フィールドが存在するが、検証エラーが

私は(それがClientフィールドの検証エラーField is requiredを引き起こすデータベース内のモデルインスタンスを更新したいAltoughフィールドがあります私はプログラムをトレースするときに空ではありません)。

詳細:

、下記のように、私はモデルProjectを持っている:

namespace ProjectManager.Models 
{ 
    public class Project 
    { 
     [Key] 
     public int Id { get; set; } 

     [Required] 
     [Display(Name = "نام پروژه")] 
     [StringLength(100, MinimumLength = 5, ErrorMessage = "{0} باید حداقل {2} و حداکثر {1} کاراکتری باشد")] 
     public string Name { get; set; } 

     [Display(Name = "کارفرما")] 
     [Required] 
     public virtual ApplicationUser Client { get; set; } 

     [ForeignKey("Client")] 
     public string ClientId{ get; set; } 


     [Display(Name = "مدیر پروژه")] 
     [Required] 
     public virtual ApplicationUser ProjectManager { get; set; } 

     [ForeignKey("ProjectManager")] 
     public string ProjectManagerId{ get; set; } 

     [Range(0,100)] 
     [Display(Name = "پیشرفت پروژه")] 
     [Required] 
     public int Progress { get; set; } 

     [DataType(DataType.Date)] 
     [Display(Name = "تاریخ ثبت پروژه")] 
     [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] 
     public DateTime CreateDate { get; set; } 

     //[Required] 
     [Column("Disabled")] 
     [Display(Name = "غیرفعال")] 
     public bool Disabled{ get; set; } 

     //[Required] 
     [Column("Status")] 
     [Display(Name = "وضعیت")] 
     public string Status{ get; set; } 

     //-------------------- Payment Requests of Projects 
     public virtual ICollection<PaymentRequest> PaymentRequests { get; set; } 
     public virtual ICollection<Contract> Contracts { get; set; } 

    } 
} 

私はプロジェクトの進捗状況を変更したい場合は、私は、コントローラの下に使用します。

public ActionResult UpdateProgress() 
    { 
     ApplicationUser projectManager = db.Users.Find(User.Identity.GetUserId()); 
     Project project = Utils.getProjectManagerProject(projectManager, db); 
     EditProgressProjectViewModel model = new EditProgressProjectViewModel 
     { 
      Progress = project.Progress 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult UpdateProgress(EditProgressProjectViewModel projectModel) 
    { 
     if (projectModel == null) 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     if (ModelState.IsValid) 
     { 
      ApplicationUser projectManager = db.Users.Find(User.Identity.GetUserId()); 
      Project project = Utils.getProjectManagerProject(projectManager, db); 
      project.Progress = projectModel.Progress; 
      try 
      { 
       db.SaveChanges(); 
      } 
      catch (DbEntityValidationException e) 
      { 
       Utils.addValidationErrorsToModelState(ModelState, e); 
       return View(projectModel); 
      } 
      return RedirectToAction("Index"); 
     } 
     return View(projectModel); 
    } 
} 

しかししようdb.saveChanges()を実行すると、 "Field Client is required"と言う検証エラーが発生しますが、project.clientは空ではありません。すでにデータベースから取り出した値で埋められています。これを使用しなければならない

[Display(Name = "کارفرما")] 
    [Required] 
    public virtual ApplicationUser Client { get; set; } 

    [ForeignKey("Client")] 
    public string ClientId{ get; set; } 

[Display(Name = "کارفرما")] 
    public virtual ApplicationUser Client { get; set; } 

    [ForeignKey("Client")] 
    [Required] //**** Right Place for required annotation**** 
    public string ClientId{ get; set; } 

[Required]ForeignKey IDませんForeignKeyのために配置する必要があります

+1

カスタムエラーメッセージ( 'int'は' null')を必要とせず、 'Client'から' [Required] '属性を削除しない限り、' [Required] '属性を' int'プロパティに追加することはできません。 。あなたのビューのモデルは 'EditProgressProjectViewModel'ですが、表示されているのは' Project'です –

+0

@StephenMuecke EditProgressProjectViewModelは進捗のための 'int'フィールドを含んでいます。 'int'を' int'に変更し、その後に '[Required]'を使うべきですか?しかし、私は 'Client'フィールドが正しい値で設定されていることをどのように確認できますか? – VSB

+0

'int'が常に必要なので(' Required(ErrorMessage = "Please enter a number")) ')ヌルにすることはできません) –

答えて

2

問題が[Required]は、それが代わりにこの宣言の意味 、悪い場所で定義されていますオブジェクト。

関連する問題