Резюме: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 не пуст и он заполняется значением, которое уже получено из базы данных.
Нет смысла добавлять атрибут '[Обязательный]' к свойству 'int', если вы не хотите, чтобы пользовательское сообщение об ошибке (' int' не может быть 'null') и удалить атрибут' [Обязательный] 'из' Client' , Модель в вашем представлении - «EditProgressProjectViewModel», но все, что вы показали, - «Проект» –
@StephenMuecke EditProgressProjectViewModel просто содержит поле 'int' для достижения прогресса. вы имеете в виду, что я должен изменить 'int' на' int? 'и использовать' [Required] 'after? Однако как я могу быть уверен, что поле «Клиент» задано с правильным значением (оно не пустое или пустое или что-то вроде этого)? – VSB
Если его 'int' является единственной причиной использования' RequiredAttribute', это добавить специальное сообщение (например, '[Обязательный (ErrorMessage =" Пожалуйста, введите число ")]'), потому что всегда требуется 'int' (это не может быть «null») –