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
위해 배치해야
사용자 정의 오류 메시지 ('int'는'null')를 원하지 않고'Client'에서'[Required]'속성을 제거하지 않는 한'int' 속성에'[Required]'속성을 추가하지 마십시오. . 보기의 모델은'EditProgressProjectViewModel'이지만, 여러분이 보여준 것은'Project'입니다. –
@StephenMuecke EditProgressProjectViewModel은 진행을위한'int' 필드를 포함합니다. 당신은'int'를'int'로 변경해야하고'[Required]'를 나중에 사용하겠습니까? 그러나 나는 어떻게'Client' 필드가 올바른 값으로 설정되었는지를 확신 할 수 있습니까 (null이 아니거나 비어 있거나 이와 같은 것입니까?)? – VSB
'int'는'RequiredAttribute'를 사용하는 유일한 이유는'int'가 항상 필요하기 때문에 커스텀 메시지를 추가하는 것입니다 (예를 들어'[Required (ErrorMessage = "Please enter number")]') 'null'일 수 없음) –