Kiểm tra cái này quá:
Hướng dẫn hoàn chỉnh để xác thực trong ASP.NET MVC 3 - Phần 2
Các phần chính của bài viết theo sau (copy-paste).
Có bốn phần riêng biệt để tạo trình xác thực tùy chỉnh đầy đủ chức năng hoạt động trên cả máy khách và máy chủ. Đầu tiên, chúng tôi phân lớp ValidationAttribute
và thêm logic xác thực phía máy chủ của chúng tôi. Tiếp theo, chúng tôi triển khai IClientValidatable
trên thuộc tính của mình để cho phép các data-*
thuộc tính HTML5 được chuyển đến máy khách. Thứ ba, chúng tôi viết một hàm JavaScript tùy chỉnh để thực hiện xác thực trên máy khách. Cuối cùng, chúng tôi tạo một bộ điều hợp để chuyển đổi các thuộc tính HTML5 thành một định dạng mà chức năng tùy chỉnh của chúng tôi có thể hiểu được. Mặc dù điều này nghe có vẻ như rất nhiều công việc, nhưng một khi bạn bắt đầu, bạn sẽ thấy nó tương đối đơn giản.
Xác thực lớp con
Trong ví dụ này, chúng ta sẽ viết một trình xác thực NotEqualTo chỉ đơn giản là kiểm tra xem giá trị của một thuộc tính không bằng giá trị của một thuộc tính khác.
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public sealed class NotEqualToAttribute : ValidationAttribute
{
private const string DefaultErrorMessage = "{0} cannot be the same as {1}.";
public string OtherProperty { get; private set; }
public NotEqualToAttribute(string otherProperty)
: base(DefaultErrorMessage)
{
if (string.IsNullOrEmpty(otherProperty))
{
throw new ArgumentNullException("otherProperty");
}
OtherProperty = otherProperty;
}
public override string FormatErrorMessage(string name)
{
return string.Format(ErrorMessageString, name, OtherProperty);
}
protected override ValidationResult IsValid(object value,
ValidationContext validationContext)
{
if (value != null)
{
var otherProperty = validationContext.ObjectInstance.GetType()
.GetProperty(OtherProperty);
var otherPropertyValue = otherProperty
.GetValue(validationContext.ObjectInstance, null);
if (value.Equals(otherPropertyValue))
{
return new ValidationResult(
FormatErrorMessage(validationContext.DisplayName));
}
}
return ValidationResult.Success;
}
}
Thêm thuộc tính mới vào thuộc tính mật khẩu của RegisterModel và chạy ứng dụng.
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
[NotEqualTo("UserName")]
public string Password { get; set; }
...
Triển khai IClientValidatable
ASP.NET MVC 2 có một cơ chế để thêm xác thực phía máy khách nhưng nó không đẹp lắm. Rất may trong MVC 3, mọi thứ đã được cải thiện và quá trình này hiện khá đơn giản và rất may không liên quan đến việc thay đổi Global.asax
như trong phiên bản trước.
Bước đầu tiên là để thuộc tính xác thực tùy chỉnh của bạn triển khai IClientValidatable. Đây là một giao diện đơn giản, một phương thức:
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
ModelMetadata metadata,
ControllerContext context)
{
var clientValidationRule = new ModelClientValidationRule()
{
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
ValidationType = "notequalto"
};
clientValidationRule.ValidationParameters.Add("otherproperty", OtherProperty);
return new[] { clientValidationRule };
}
Nếu bạn chạy ứng dụng ngay bây giờ và xem mã nguồn, bạn sẽ thấy html nhập mật khẩu bây giờ chứa các notequalto
thuộc tính dữ liệu của bạn :
<div class="editor-field">
<input data-val="true" data-val-notequalto="Password cannot be the same as UserName."
data-val-notequalto-otherproperty="UserName"
data-val-regex="Weak password detected."
data-val-regex-pattern="^(?!password$)(?!12345$).*"
data-val-required="The Password field is required."
id="Password" name="Password" type="password" />
<span class="hint">Enter your password here</span>
<span class="field-validation-valid" data-valmsg-for="Password"
data-valmsg-replace="true"></span>
</div>
Tạo một hàm xác thực jQuery tùy chỉnh
Tất cả mã này tốt nhất nên được đặt trong một tệp JavaScript riêng.
(function ($) {
$.validator.addMethod("notequalto", function (value, element, params) {
if (!this.optional(element)) {
var otherProp = $('#' + params);
return (otherProp.val() !=
}
return true;
});
$.validator.unobtrusive.adapters.addSingleVal("notequalto", "otherproperty");
}(jQuery));
Tùy thuộc vào yêu cầu xác thực của bạn, bạn có thể thấy rằng thư viện jquery.validate đã có mã mà bạn cần để xác thực chính nó. Có rất nhiều trình xác thực trong jquery.validate chưa được triển khai hoặc ánh xạ tới các chú thích dữ liệu, vì vậy nếu chúng đáp ứng nhu cầu của bạn, thì tất cả những gì bạn cần viết trong javascript là một bộ điều hợp hoặc thậm chí là một lệnh gọi đến một bộ điều hợp tích hợp sẵn. nhỏ như một dòng duy nhất. Hãy nhìn vào bên trong jquery.validate.js để tìm hiểu những gì có sẵn.
Sử dụng bộ điều hợp jquery.validate.unobtruser hiện có
Công việc của bộ điều hợp là đọc các data-*
thuộc tính HTML5 trên phần tử biểu mẫu của bạn và chuyển đổi dữ liệu này thành một biểu mẫu mà jquery.validate và chức năng xác thực tùy chỉnh của bạn có thể hiểu được. Tuy nhiên, bạn không bắt buộc phải tự mình làm tất cả công việc và trong nhiều trường hợp, bạn có thể gọi một bộ điều hợp tích hợp sẵn. jquery.validate.unobtrusing khai báo ba bộ điều hợp tích hợp có thể được sử dụng trong phần lớn các tình huống. Đó là:
jQuery.validator.unobtrusive.adapters.addBool - used when your validator does not need any additional data.
jQuery.validator.unobtrusive.adapters.addSingleVal - used when your validator takes in one piece of additional data.
jQuery.validator.unobtrusive.adapters.addMinMax - used when your validator deals with minimum and maximum values such as range or string length.
Nếu trình xác thực của bạn không phù hợp với một trong các danh mục này, bạn bắt buộc phải viết bộ điều hợp của riêng mình bằng jQuery.validator.unobtrusive.adapters.add
phương pháp này. Điều này không quá khó khăn và chúng ta sẽ xem một ví dụ sau trong bài viết.
Chúng tôi sử dụng addSingleVal
phương thức, truyền vào tên của bộ điều hợp và tên của giá trị duy nhất mà chúng tôi muốn chuyển. Nếu tên của hàm xác thực khác với bộ điều hợp, bạn có thể chuyển vào tham số thứ ba ( ruleName
):
jQuery.validator.unobtrusive.adapters.addSingleVal("notequalto", "otherproperty", "mynotequaltofunction");
Tại thời điểm này, trình xác thực tùy chỉnh của chúng tôi đã hoàn tất.
Để hiểu rõ hơn, hãy tham khảo bài viết trình bày nhiều mô tả hơn và một ví dụ phức tạp hơn.
HTH.