0

Резюме:ASP.NET MVC: поле присутствует, но ошибка проверки говорит «поле обязательно для заполнения»

Когда я хочу, чтобы обновить экземпляр модели внутри базы данных, что вызывает ошибку проверки Field is required для Client поля (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() вызывают ошибки проверки, которые говорят «Полевой клиент требуется», но project.client не пуст и он заполняется значением, которое уже получено из базы данных.

+1

Нет смысла добавлять атрибут '[Обязательный]' к свойству 'int', если вы не хотите, чтобы пользовательское сообщение об ошибке (' int' не может быть 'null') и удалить атрибут' [Обязательный] 'из' Client' , Модель в вашем представлении - «EditProgressProjectViewModel», но все, что вы показали, - «Проект» –

+0

@StephenMuecke EditProgressProjectViewModel просто содержит поле 'int' для достижения прогресса. вы имеете в виду, что я должен изменить 'int' на' int? 'и использовать' [Required] 'after? Однако как я могу быть уверен, что поле «Клиент» задано с правильным значением (оно не пустое или пустое или что-то вроде этого)? – VSB

+0

Если его 'int' является единственной причиной использования' RequiredAttribute', это добавить специальное сообщение (например, '[Обязательный (ErrorMessage =" Пожалуйста, введите число ")]'), потому что всегда требуется 'int' (это не может быть «null») –

ответ

2

Проблема [Required] определяется в плохом месте, это означает, что вместо этого заявления:

[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 Объект.

Смежные вопросы