0

요약 "필드가 필요합니다"라고 :ASP.NET MVC : 필드에 존재하지만 유효성 검사 오류가

나는 (이 Client 필드에 대한 유효성 검사 오류 Field is required의 원인이 데이터베이스 내부 모델 인스턴스를 업데이트 할 입력해도 필드가 저장하기 전에 채워지고 프로그램을 추적 할 때 비어 있지 않습니다).

세부 사항 : 아래와 같은 내가 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()를 실행하면 "필드 클라이언트가 필요합니다"라고 말하는 유효성 검사 오류가 발생하지만 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]'속성을 제거하지 않는 한'int' 속성에'[Required]'속성을 추가하지 마십시오. . 보기의 모델은'EditProgressProjectViewModel'이지만, 여러분이 보여준 것은'Project'입니다. –

+0

@StephenMuecke EditProgressProjectViewModel은 진행을위한'int' 필드를 포함합니다. 당신은'int'를'int'로 변경해야하고'[Required]'를 나중에 사용하겠습니까? 그러나 나는 어떻게'Client' 필드가 올바른 값으로 설정되었는지를 확신 할 수 있습니까 (null이 아니거나 비어 있거나 이와 같은 것입니까?)? – VSB

+0

'int'는'RequiredAttribute'를 사용하는 유일한 이유는'int'가 항상 필요하기 때문에 커스텀 메시지를 추가하는 것입니다 (예를 들어'[Required (ErrorMessage = "Please enter number")]') 'null'일 수 없음) –

답변

2

문제 [Required]가 대신이 선언 수단 나쁜 장소에 정의된다 목적.