0

我正在尝试第一次实现不显眼的客户端验证。我觉得我非常接近,只是无法让消息显示在屏幕上。如果有人可以在这里指导我正确的方向,我将不胜感激。这是我到目前为止所拥有的。

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 中的消息正在进入视图。

为了让它显示在视图本身中,我缺少什么?我觉得我错过了一些非常简单的东西,我可能忽略了我已经审查过的几个资源。

4

2 回答 2

0

购买这本书后,我能够缩小问题的范围。专业的 ASP.NET MVC 5。我的语法非常接近。我有两个问题。一,我没有传递任何参数来检查我的值。其次,我需要@Scripts.Render("~/bundles/jqueryval")在渲染验证脚本之前调用。仅仅包括它是不够的。顺序很重要。

于 2018-07-22T20:44:28.780 回答
0

这是一种不同的方法,但对于条件验证,我建议使用万无一失的验证。

为此,您需要:

  1. 安装follproof nuget包
  2. 添加mvcfoolproof.unobtrusive.js到您的脚本(从这里获取

然后你可以像这样使用条件验证:

public class MyModel 
{
    public DateTime WtStartTime { get; set; } 

    /* I want end time to be greater than or equal to start time */
    [GreaterThanOrEqualTo("WtStartTime", ErrorMessage="End should be >= Start")]
    public DateTime WtEndtime{ get; set; } 

}

就是这样,您不需要编写自己的 JavaScript 代码来进行客户端验证。请注意,您需要将ValidationSummary添加到您的视图中。您需要将以下行添加到您的视图中,它会显示错误消息。

@Html.ValidationSummary(true, "", new { @class = "text-danger" })
于 2018-07-21T01:55:37.540 回答