Tôi đã tạo thuộc tính xác thực CompareLessThan tùy chỉnh bằng cách sao chép ASP.NET MVC 3 CompareAttribute và thay vì kiểm tra tính bình đẳng, tôi kiểm tra xem một thuộc tính có nhỏ hơn giá trị khác không. Nếu có lỗi phía máy khách, thông báo '{0} phải nhỏ hơn {1}' được hiển thị cho người dùng.ASP.NET MVC ValidationAttribute Nhận Tên Hiển thị Thuộc tính Khác
Mô hình của tôi được thiết lập như sau với thuộc tính Hiển thị tham chiếu tệp tài nguyên.
[CompareLessThan("AmountAvailable", ErrorMessageResourceName="CompareLessThan", ErrorMessageResourceType = typeof(Resources.ValidationMessages))]
[Display(Name = "Amount", ResourceType = typeof(Resources.Labels))]
public decimal Amount { get; set; }
[Display(Name = "AmountAvailable", ResourceType = typeof(Resources.Labels))]
public decimal AmountAvailable { get; set; }
Sau đó, tùy chỉnh GetClientValidationRules xác nhận phương pháp là chính xác giống như trong CompareAttribute
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationLessThanRule(FormatErrorMessage(metadata.DisplayName), FormatPropertyForClientValidation(OtherProperty), this.AllowEquality);
}
Ở đây chúng ta đang tạo ra các thông báo lỗi sẽ được hiển thị cho người dùng nếu có một vấn đề. Tôi có thể lấy tên hiển thị từ tệp tài nguyên cho thuộc tính được trang trí với thuộc tính CompareLessThan tùy chỉnh của tôi, nhưng câu hỏi của tôi là làm cách nào để tôi lấy tên hiển thị của thuộc tính 'khác' mà chúng ta so sánh? Trong phương thức IsValid chúng ta có một tham chiếu đến validationContext mà từ đó tôi có thể tạo ra một đối tượng PropertyInfo cho thuộc tính 'other' và tôi nghĩ rằng có tên hiển thị. Nhưng, trong GetClientValidationRules tôi không có quyền truy cập vào đó.
Tôi luôn có thể chuyển giá trị khác cho tên hiển thị của thuộc tính khác nhưng tôi đã hy vọng sẽ có cách để lấy nó như tôi đã chỉ định nó bằng chú thích dữ liệu.
Bất kỳ ý tưởng nào?
Suy nghĩ tốt nhưng bộ sưu tập Thuộc tính luôn trống. –
@NickOlsen Thật đáng buồn. Tôi đã cập nhật câu trả lời của mình với một số cách giải quyết khác. – nemesv
Điều đó không làm việc hoặc là siêu dữ liệu.Model tài sản chỉ là giá trị 0. Sử dụng logic của bạn tôi đã có thể tìm ra một cách khác để làm điều đó (xem câu trả lời khác) nhưng tôi không thực sự thích nó. Tôi hy vọng có một cách tốt hơn mà người khác có thể cung cấp. –