【问题标题】:The custom client-side validation(attribute) doesn't trigger in MVC 4自定义客户端验证(属性)不会在 MVC 4 中触发
【发布时间】:2013-12-04 11:36:12
【问题描述】:

我编写了一个代码来验证传入的数据。

所有内置验证(RequiredAttribute等)都有效...

但我自己的写的 DateRangeAttribute 不会在帖子上触发错误,帖子会发到我的控制器 :(。

被覆盖的 IsValid 方法发回 good(false) 值,并且在服务器端控制器可以正确看到 Invalid ModelState,但客户端看不到。

数据验证属性在浏览器上呈现为 HTML:

我希望在所有数据都真正有效之前避免发帖。

有代码:

日期范围属性

public class DateRangeAttribute : RangeAttribute
    {
        public DateRangeAttribute (string minimumYear) 
            :base(typeof(DateTime), minimumYear, DateTime.Now.Year.ToString())
        {
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            var inputYear = value as int?;
            var result = (inputYear != null && inputYear >= 1886 && inputYear <= DateTime.Now.Year);

            return result ? ValidationResult.Success : new ValidationResult(GetErrorMessage());
        }

        private string GetErrorMessage()
        {
            return "The year must be greater than 1886 and lower than the actual year.";
        }

        public override string FormatErrorMessage(string name)
        {
            return string.Format(GetErrorMessage(), name);
        }
    }

创建.cshtml

<script src="@Url.Content("~/Scripts/jquery-1.8.2.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>

<!-- ... -->

@using (Html.BeginForm("Create", "Car", FormMethod.Post, new { id = "CreateForm" }))
{ 
    @Html.ValidationSummary(true)
    <!-- ... -->
        @Html.LabelFor(model => model.Year)
        @Html.EditorFor(model => model.Year)
        @Html.ValidationMessageFor(model => model.Year)
    <!-- ... -->
}

Web.Config file:
<configuration>
    <appSettings>
        <!-- ... -->
        <add key="ClientValidationEnabled" value="true" />
        <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    </appSettings>
    <!-- ... -->
</configuration>

【问题讨论】:

    标签: c# jquery asp.net-mvc validation


    【解决方案1】:

    您还必须通过IClientValidatable 提供自定义客户端验证实现。因此,我建议您直接从 ValidationAttribute 继承,因为无论如何您都必须更改几乎所有内容

    【讨论】:

    • 我所做的一切都与以下视频中的完全一样,但我没有收到错误消息:youtube.com/watch?v=vcX8WW4fL1s
    • 该视频教了很多错误的东西 1) 最小年份是硬编码的,因此当您将应用程序国际化时可能无法正确解析(某些文化使用 MM/DD/YYYY,而其他文化使用 DD/MM /YYYY) 2) 每个属性创建一个 DateRangeAttribute 实例,然后在后续请求中重用,因此最大值将是第一次提交的时间。最后,作者在blog post 中提到客户端验证不起作用,将在稍后的视频会议中讨论
    • 哦,我明白了。但是如何在客户端触发他们的事件?作弊时间? :) 你能把你的想法告诉我吗?
    • 网上有样片。喜欢this 只需根据您的需要稍微修改一下即可
    猜你喜欢
    • 2013-11-12
    • 1970-01-01
    • 2017-05-08
    • 2013-11-23
    • 1970-01-01
    • 2014-05-26
    • 2014-11-03
    • 2012-03-06
    • 2012-03-10
    相关资源
    最近更新 更多