11

tôi hỏi câu hỏi tương tự here nhưng trong câu hỏi này tôi sử dụng thực hiện khác, chính xác this way các mã sau đây cho thấy hiện thực của tôi:ASP.NET MVC thực hiện sử dụng tùy chỉnh validator IClientValidatable

mẫu:

public class Department { 

    public long Id { get; set; } 

    [IsDateAfter("Date2", true, ErrorMessage = "O My")] 
    public DateTime Date1 { get; set; } 
    public DateTime Date2 { get; set; } 
    public string Name1 { get; set; } 
    public string Name2 { get; set; } 

} 

Trình xác thực tùy chỉnh:

public sealed class IsDateAfter : ValidationAttribute, IClientValidatable { 

    private readonly string testedPropertyName; 
    private readonly bool allowEqualDates; 

    public IsDateAfter(string testedPropertyName, bool allowEqualDates = false) 
    { 
     this.testedPropertyName = testedPropertyName; 
     this.allowEqualDates = allowEqualDates; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext 
validationContext) { 
     var propertyTestedInfo = 
validationContext.ObjectType.GetProperty(this.testedPropertyName); 
     if (propertyTestedInfo == null) { 
      return new ValidationResult(string.Format("unknown property 
{0}", this.testedPropertyName)); 
     } 

     var propertyTestedValue = 
propertyTestedInfo.GetValue(validationContext.ObjectInstance, null); 

     if (value == null || !(value is DateTime)) { 
      return ValidationResult.Success; 
     } 

     if (propertyTestedValue == null || !(propertyTestedValue is 
DateTime)) { 
      return ValidationResult.Success; 
     } 

     // Compare values 
     if ((DateTime)value >= (DateTime)propertyTestedValue) { 
      if (this.allowEqualDates) { 
       return ValidationResult.Success; 
      } 
      if ((DateTime)value > (DateTime)propertyTestedValue) { 
       return ValidationResult.Success; 
      } 
     } 

     return new 
ValidationResult(FormatErrorMessage(validationContext.DisplayName)); 
    } 

    public IEnumerable<ModelClientValidationRule> 
GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { 
     var rule = new ModelClientValidationRule { 
      ErrorMessage = this.ErrorMessageString, 
      ValidationType = "isdateafter" 
     }; 
     rule.ValidationParameters["propertytested"] = 
this.testedPropertyName; 
     rule.ValidationParameters["allowequaldates"] = 
this.allowEqualDates; 
     yield return rule; 
    } 
} 

Script:

$.validator.unobtrusive.adapters.add(
'isdateafter', ['propertytested', 'allowequaldates'], function (options) { 
    options.rules['isdateafter'] = options.params; 
    options.messages['isdateafter'] = options.message; 
}); 
$.validator.addMethod("isdateafter", function (value, element, params) { 
alert(params.propertytested); 
var startdatevalue = $('input[name="' + params.propertytested + '"]').val(); 
if (!value || !startdatevalue) return true; 
return (params.allowequaldates) ? Date.parse(startdatevalue) <= Date.parse(value) : 
Date.parse(startdatevalue) < Date.parse(value); 
}, ''); 

Và trang _Layout My (trang Thạc sĩ)

<!DOCTYPE html> 
<html> 
<head> 
<title>@ViewBag.Title</title> 
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" /> 
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"> 
</script> 
<script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript"> 
</script> 
<script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" type="text/javascript"> 
</script> 
<script src="@Url.Content("~/Scripts/MicrosoftMvcValidation.js")" 
type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" 
type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"> 
</script> 
<script src="@Url.Content("~/Scripts/jQuery.IsDateAfter.js")" 
type="text/javascript"></script> 
</head> 
<body> 
<div class="page"> 
    <div id="header"> 
     <div id="title"> 
      <h1> 
       My MVC Application</h1> 
     </div> 
     <div id="logindisplay"> 
      @Html.Partial("_LogOnPartial") 
     </div> 
     <div id="menucontainer"> 
      <ul id="menu"> 
     <li>@Html.ActionLink("Departments", "Index", "Department")</li> 
      </ul> 
     </div> 
    </div> 
    <div id="main"> 
     @RenderBody() 
    </div> 
    <div id="footer"> 
    </div> 
</div> 
</body> 
</html> 

tất nhiên trong chỉnh sửa và tạo Xem trang nguồn kịch bản khác được như sau:

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"> 
</script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" 
type="text/javascript"></script> 

Một phần của trang tạo Dom:

<fieldset> 
<legend>Department</legend> 
<div class="editor-label"> 
<label for="Date1">Date1</label> 
</div> 
<div class="editor-field"> 
<input id="Date1" class="text-box single-line valid" type="text" value="" name="Date1" 
data-val-required="The Date1 field is required." data-val-isdateafter- 
propertytested="Date2" data-val-isdateafter-allowequaldates="False" data-val- 
isdateafter="O My" data-val="true"> 
<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg- 
    for="Date1"></span> 
</div> 
<div class="editor-label"> 
<label for="Date2">Date2</label> 
</div> 
<div class="editor-field"> 
<input id="Date2" class="text-box single-line valid" type="text" value="" name="Date2" 
data-val-required="The Date2 field is required." data-val="true"> 
<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg- 
for="Date2"></span> 
</div> 

tôi cố gắng tất cả thực hiện được giống như here nhưng điều đó không làm việc trong phía khách hàng và cần phải postback, tôi không có bất kỳ thực hiện khác ví dụ như đăng ký trong global.asax như this, Liệu ai biết về nó? Tôi thực sự bối rối, tôi đã thử 2 cách nhưng không ai trong số họ đưa ra câu trả lời đúng.

Trả lời

9

Bạn đã làm sai lệch nội dung tập lệnh của mình. Trong _Layout của bạn, bạn đã bao gồm các kịch bản sau đây theo thứ tự mà:

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jQuery.IsDateAfter.js")" type="text/javascript"></script> 

Bây giờ rõ ràng là jquery.validate.min.jsjquery.validate.js đại diện cho cùng một kịch bản, đầu tiên là phiên bản rút gọn. Nhưng vì bạn chưa bao gồm tập lệnh jquery.validate.unobtrusive.js (điều này được thực hiện sau này trong chế độ xem của bạn), tập lệnh jQuery.IsDateAfter.js tùy chỉnh của bạn sẽ chứa lỗi vì nó sẽ không biết về đối tượng $.validator.unobtrusive.adapters mà bạn đang sử dụng. Vì vậy, đây là kịch bản trong cách bố trí của bạn sẽ giống như thế nào:

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

Bạn cũng có thể thêm tùy chỉnh jQuery.IsDateAfter.js kịch bản của bạn bố trí ở cuối nếu bạn muốn trong trường hợp nó được sử dụng trong nhiều quan điểm và nếu không bạn có thể thêm nó để xem:

<script src="@Url.Content("~/Scripts/jQuery.IsDateAfter.js")" type="text/javascript"></script> 

Đó là tập lệnh duy nhất bạn nên có trong chế độ xem. Bạn nên xóa bất kỳ nội dung nào khác của tập lệnh jquery.* từ các trang Chỉnh sửa và Tạo chế độ xem.

Lưu ý: bạn cũng sẽ nhận thấy rằng tôi đã xóa tất cả Microsoft*.js tập lệnh từ Bố cục của bạn. Chúng đã lỗi thời và không còn được sử dụng trong ASP.NET MVC 3.

+2

Tôi đã làm theo điều này và có thể thấy thông báo lỗi xác thực trong khi tôi chỉnh sửa biểu mẫu tuyệt vời. Một điều kỳ lạ về nó, rằng nó không ngừng hình thức đăng bài thậm chí có trường không hợp lệ với các thông báo lỗi xác nhận hợp lệ tuy nhiên máy chủ không nhận ra ModelState.IsValid là sai ... là hành vi bình thường này hoặc tôi thiếu một cái gì đó? – afr0

Các vấn đề liên quan