【问题标题】:validate age according to date of birth using model in mvc 4使用 mvc 4 中的模型根据出生日期验证年龄
【发布时间】:2015-06-22 07:16:27
【问题描述】:

我有注册表,其中包含出生日期字段。

使用日历日期选择器将值输入到该字段。

这些是为该字段插入值的步骤

第一步

第二步

第三步

所以它以 dd/MM/yyyy 格式取值

这是我的模型类

出生日期字段的外观
[DisplayName("Date of Birth")]
[DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public Nullable<System.DateTime> Date_of_Birth { get; set; }

这是我的查看文件

出生日期字段的外观
   <div class="form-group"> 
   <div class="editor-label">
        @Html.LabelFor(model => model.Date_of_Birth)
        @Html.Label("*", new { id="star" , @class = "requiredFiledCol" })
   </div>
   <div class="editor-field">
        @Html.TextBoxFor(model => model.Date_of_Birth, "{0:dd/MM/yyyy}", new { @class = "form-control datepicker", placeholder = "DD/MM/YYYY" , maxlength="100" })
        @Html.ValidationMessageFor(model => model.Date_of_Birth)
    </div>
    </div>

我想对出生字段的数据进行客户端验证。当输入字段不在此范围内时显示错误消息100>Age>18

我应该采取什么方法?

【问题讨论】:

  • 没有什么可以做到这一点。您需要编写自己的验证属性并实现IClientValidatableThis article 提供了很好的指导。
  • 旁注:您没有使用EditorFor() 来生成HTML5 日期选择器,因此不需要[DataType(DataType.Date)]ApplyFormatInEditMode = true(它们仅适用于EditorFor()
  • 我希望你通过javascript初始化datepicker。然后,您将有几个选项来设置 start dateend date,这样您就可以不用担心验证来渲染您的日期选择器
  • @Chathz,根据今天的日期计算控制器中允许的最小和最大日期,然后将它们传递给视图(使用视图模型或ViewBag 属性,然后设置日期选择器minDatemaxDate 选项 - 例如 { ..., minDate: @Model.MiinDate, ...}` 但这不会为您提供服务器端验证,因此您需要再次检查 POST 方法并酌情添加 ModelState.Errors
  • @Chathz,您还可以使用数字偏移量来指定 minDateMaxDate 值,例如{ minDate: -20, maxDate: "+1M +10D" }。 `Refer documentation

标签: c# jquery asp.net asp.net-mvc-4 razor


【解决方案1】:

既然您已经在使用数据注释,为什么不自己制作。 这样做:

在您使用的 dll 中创建一个类或创建一个新类,并至少向其中添加以下代码

public class MinimumAgeAttribute: ValidationAttribute
{
    int _minimumAge;

    public MinimumAgeAttribute(int minimumAge)
    {
      _minimumAge = minimumAge;
    }

    public override bool IsValid(object value)
    {
        DateTime date;
        if (DateTime.TryParse(value.ToString(),out date))
        {
            return date.AddYears(_minimumAge) < DateTime.Now;
        }

        return false;
    }
}

然后在您的视图模型中执行以下操作:

[MinimumAge(18)]
[DisplayName("Date of Birth")]
[DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public Nullable<System.DateTime> Date_of_Birth { get; set; }

或者您的网页不会有任何问题,因为您使用的框架会选择它。在不更改类中的 ErrorMessage 属性的情况下,您将获得类似

“{0}”字段无效。

{0} 被您在模型中提供的属性名称或显示名称属性替换。

希望它对你有用。

沃尔特 ps:确保在你做的控制器中

if (ModelState.IsValid)
{
 ....
}

【讨论】:

  • 这看起来像答案,你知道如何用它添加自定义错误消息吗?
  • 嗯,是的,只需以与从 ValidationAttribute 继承的 MinimumAgeAttribute 相同的数据注释方式添加它,您只需使用 .net 方式通过资源或硬编码字符串值添加它
【解决方案2】:

我已经改进了 Walter 关于进行自定义验证的回答。我添加了更好的错误消息支持。这将允许更好的默认错误消息,还允许您输入具有更好的 string.Format 支持的自己的错误消息。我还更新了命名方案。例如,您应该在开头添加日期,以便您和其他开发人员知道此验证只能与 DateTime 变量一起使用,类似于为字符串命名基本 StringLengthAttribute 的方式。

public class DateMinimumAgeAttribute : ValidationAttribute
{
    public DateMinimumAgeAttribute(int minimumAge)
    {
        MinimumAge = minimumAge;
        ErrorMessage = "{0} must be someone at least {1} years of age";
    }

    public override bool IsValid(object value)
    {
        DateTime date;
        if ((value != null && DateTime.TryParse(value.ToString(), out date)))
        {
            return date.AddYears(MinimumAge) < DateTime.Now;
        }

        return false;
    }

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

    public int MinimumAge { get; }
}


[DateMinimumAge(18, ErrorMessage="{0} must be someone at least {1} years of age")]
[DisplayName("Date of Birth")]
[DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public Nullable<System.DateTime> Date_of_Birth { get; set; }

【讨论】:

  • 这似乎有效,但它不允许 NULL[Date_of_Birth] 即使模型显示为 Nullable。它在控制器的 ModelState.IsValid 部分返回 false。有没有办法让 NULL 作为 true 传递给 ModelState.IsValid?
【解决方案3】:

一条评论询问 TroySteven 是否有办法允许 null

public override bool IsValid(object value)
{
    DateTime date;
    if (value == null)  //you can just add this condition
    {
        return true;
    }
    if ((value != null && DateTime.TryParse(value, out date)))
    {
        return date.AddYears(MinimumAge) < DateTime.Now;
    }

    return false;
}

【讨论】:

    【解决方案4】:

    为@Html.ValidationMessageFor 和@Html.TextBoxFor 创建一个id,然后使用javascript 来验证它。在您看来,请执行以下操作:

    @section scripts{
        <script>
          $(function () {
             if (document.getElementById("yourTextBoxID").value < 18){
                 document.getElementById("yourValidationMessageID").value = "Can't be less than 18 years old :("
                }
           });
        </script>
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 2013-08-27
      • 2020-06-01
      • 1970-01-01
      相关资源
      最近更新 更多