我正在尝试第一次实现不显眼的客户端验证。我觉得我非常接近,只是无法让消息显示在屏幕上。如果有人可以在这里指导我正确的方向,我将不胜感激。这是我到目前为止所拥有的。
Validation Attribute
public class WellTestRecordVal : ValidationAttribute , IClientValidatable
{
private WellTestViewModel record;
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
record = (WellTestViewModel) validationContext.ObjectInstance;
if (record.WtStartTime > record.WtEndtime)
return new ValidationResult("This is my server val message.");
return ValidationResult.Success;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var startDate = DateTime.Today;
var rule1 = new ModelClientValidationRule();
rule1.ValidationType = "startdaterule";
rule1.ErrorMessage = "this is my iclient val message.";
return new[] {rule1};
}
我将它应用于我的模型上的属性,如下所示:
[WellTestRecordVal]
[DataType(DataType.DateTime)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-ddThh:mm:ss}")]
public DateTime WtStartTime { get; set; }
在我的包中,我有我应该需要的所有 unobtrusive.js 和 validate.unobtrusive.js 文件。
我的观点对元素进行了验证。
<label>
<span>Start Date</span>
@Html.TextBoxFor(x => x.WtStartTime, "{0:yyyy-MM-ddThh:mm:ss}", new { @class = "form-control", @type = "datetime-local", id = "startDate" })
@Html.ValidationMessageFor(m => m.WtStartTime)
</label>
我的视图的 Jquery 就是这样。
<script type="text/javascript">
$.validator.addMethod("startdaterule",
function(value, element, params) {
var endDate = $("#endDate").val();
if (value > endDate) {
return false;
}
return true;
});
$.validator.unobtrusive.adapters.add("startdaterule",function(options) {
options.rules["startdaterule"] = {};
options.messages["startdaterule"] = options.message;
});
我在视图上使用 Ajax.BeginForm。
当我检查时,我可以看到 GetClientValidationRules 中的消息正在进入视图。
为了让它显示在视图本身中,我缺少什么?我觉得我错过了一些非常简单的东西,我可能忽略了我已经审查过的几个资源。