Tôi có một kịch bản mà tôi muốn thêm một mục vào ValidationContext và kiểm tra nó trong xác thực thực thể được kích hoạt EF. Tôi đang làm điều này trong trình hướng dẫn để tôi chỉ có thể xác thực một số thứ nhất định trên các bước cụ thể. (Nếu có một mô hình tốt cho điều đó xin vui lòng chia sẻ nó).Xác thực MVC và EF với mục ValidationContext được thêm
Vấn đề là xác thực được kích hoạt, hai lần thực sự, trước khi hành động bộ điều khiển thậm chí còn bị trúng. Tôi ước tôi hiểu tại sao. Tôi không chắc chắn làm thế nào để có được các mục trong ValidationContext trước khi điều đó xảy ra, vì vậy tôi không thể nói cho xác nhận những gì bước tôi đang ở trên. Ngoài ra, nếu tôi chỉ thực hiện xác thực tùy chỉnh khi lưu thay đổi được kích hoạt bằng cách kiểm tra mục như tôi có trong mã bên dưới, thì tôi sẽ không nhận được lỗi xác thực mô hình tự động nào khi trang làm mới.
Trong bối cảnh tùy chỉnh của tôi:
public WizardStep Step { get; set; }
protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items)
{
items.Add("ValidationStep", Step);
return base.ValidateEntity(entityEntry, items);
}
Dịch vụ mà bộ thực thể:
public void SaveChanges(WizardStep step)
{
_context.Step = step;
_context.SaveChanges();
}
Trong thực thể của tôi
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
// Step will only be present when called from save changes. Calls from model state validation won't have it
if (validationContext.Items.ContainsKey("ValidationStep"))
{
var validationStep = (WizardStep)validationContext.Items["ValidationStep"];
if (validationStep == WizardStep.Introduction)
{
if (criteria)
{
yield return new ValidationResult($"Error message ", new[] { "field" });
}
}
}
}
Bộ điều khiển:
public ActionResult MyAction(HomeViewModel vm)
{
try
{
_incidentService.AddOrUpdate(vm.Enttiy);
_incidentService.SaveChanges(WizardStep.Introduction);
}
catch (Exception ex)
{
return View(vm);
}
return RedirectToAction("Index");
}
bạn đang cố gắng để làm quy tắc kinh doanh xác nhận hoặc toàn vẹn dữ liệu kiểm tra như ràng buộc duy nhất và ngoài nước hạn chế chính? Nếu bạn đang cố gắng làm điều trước đây tôi khá chắc chắn rằng một số lib bên ngoài như [FluentValidation] (https://github.com/JeremySkinner/FluentValidation) phù hợp hơn với nhu cầu của bạn. – cleftheris
@cleftheris Đó là một chút của cả hai thực sự. Tôi có mã máy phát poco đảo ngược có các thuộc tính toàn vẹn dữ liệu đã có, trên các thực thể. Sau đó, tôi có các quy tắc nghiệp vụ phức tạp hơn mà tôi đang thêm thủ công vào phương thức Validate trên các thực thể và tôi cần phải nhấn vào cơ sở dữ liệu để kiểm tra văn bản lỗi (người dùng được cấu hình). Kiểm tra db bổ sung đó là lý do tại sao tôi cần bối cảnh trong validationcontext. – Alex
Khi tôi hiểu tình hình, tôi nghĩ bạn nên đảo ngược cách tiếp cận của bạn: Sử dụng khung xác thực phổ biến cho logic nghiệp vụ phức tạp, trong đó một số quy tắc có thể truy vấn cơ sở dữ liệu nội bộ. – cleftheris