MVC 3 ValidationMessageFor()没有出现

MVC 3 ValidationMessageFor() Does Not Appear

本文关键字:ValidationMessageFor MVC      更新时间:2023-09-26

我想以dd-mm -yyyy的形式强制执行日期。我使用下面的帖子作为指南:

http://blogs.msdn.com/b/stuartleeks/archive/2011/01/25/asp-net-mvc-3-integrating-with-the-jquery-ui-date-picker-and-adding-a-jquery-validate-date-range-validator.aspx

问题:ValidationMessageFor文本将不显示(在回发和客户端)。任何建议吗?

更新:

通过包含@Darin-Demintrov的答案,这个问题中的代码现在可以工作了。请注意,在选择日期之后,验证消息仍然存在。要解决这个问题,必须根据下面的答案处理DatePicker onChange()事件。

查看模型属性:

    [Required(ErrorMessage = "* required")]
    [Display(Name = "Event Date")]
    [PpcDate]
    public DateTime EventDate { get; set; }

PpcDate ValidationAttribute Class:

public class PpcDateAttribute : ValidationAttribute, IClientValidatable, IMetadataAware
{
    /// <summary>
    /// Any valid DateTime is fine; 
    /// the regex verification only happens on the client
    /// </summary>
    public override bool IsValid(object value)
    {
        if (value == null || (value is DateTime))
            return true;
        else
            return false;
    }
    public override string FormatErrorMessage(string name)
    {
        return string.Format("{0} must be in the form dd-mmm-yyyy", name);
    }
    #region IClientValidatable Members
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRule
        {
            ErrorMessage = FormatErrorMessage(metadata.DisplayName),
            ValidationType = "ppcdate"
        };
    }
    #endregion
    #region IMetadataAware Members
    public void OnMetadataCreated(ModelMetadata metadata)
    {
        metadata.DataTypeName = "Date";
    }
    #endregion
}

视图:

@Html.EditorFor(model => model.EventDate)
@Html.ValidationMessageFor(model => model.EventDate)

和javascript连接:

(function ($) {
    // The validator function
    $.validator.addMethod('ppcdate', function (value) {
        if (!value) {
            return true;
        } else {
            return /^'d{2}-'w{3}-'d{4}$/.test(value);
        }
    });
    // The adapter to support ASP.NET MVC unobtrusive validation
    $.validator.unobtrusive.adapters.add('ppcdate', [], function (options) {
        // EDIT: Add next line per Darin's answer below.  
        options.rules['ppcdate'] = true;
        if (options.message) {
            options.messages['ppcdate'] = options.message;
        }
    });
} (jQuery));

生成的html看起来正确吗?

注意,data-val- ppcandidate属性按预期出现…

<div class="t-widget t-datepicker">
  <div class="t-picker-wrap">
    <input autocomplete="off" class="t-input valid" data-val="true" data-val-ppcdate="Event Date must be in the form dd-mmm-yyyy" data-val-required="* required" id="EventDate" name="EventDate" value="28-Sep-2011" type="text">
    <span class="t-select">
      <span class="t-icon t-icon-calendar" title="Open the calendar">Open the calendar</span>  
    </span>
  </div>
</div>
<span class="field-validation-valid" data-valmsg-for="EventDate" data-valmsg-replace="true"></span>

任何建议吗?

您忘记注册规则,您的自定义ppcdate验证方法从未触发:

$.validator.unobtrusive.adapters.add('ppcdate', [], function (options) {
    if (options.message) {
        // This is what associates the adapter with the custom validation method
        options.rules['ppcdate'] = options.params;
        options.messages['ppcdate'] = options.message;
    }
});

加载fiddler,看看你的CSS文件是否没有加载。我知道如果CSS没有加载,摘要将不会显示,所以我必须假设同样适用于单个验证项。

Darin的回答解释了为什么规则没有生效。另一个奇怪之处是,我必须在触发DatePicker onChange()事件时强制进行验证。否则,只有当用户在日期输入上直接单击或选择时,验证才会触发。如果他们打开和关闭DatePicker,即使日期是有效的,验证消息仍然存在。我正在使用teleerik控件,所以它看起来像这样:

日期。ascx文件(日期控制):

<%= Html.Telerik().DatePickerFor(m => m)
    .Format("dd-MMM-yyyy")
    .Value(ViewData["selectedDate"] as DateTime?)
    .ClientEvents(e => { e.OnChange("PPC_validateTelerikDate"); })
%>
Javascript

/*****************************************************************************
    PPC_validateTelerikDate()
    Force validation to run on the target input.  
    This function allows one to validate when the date picker changes.
    Otherwise, validation only runs when clicking the input element directly
    or tabbing through.
*****************************************************************************/
function PPC_validateTelerikDate(e) {
    // get the form validation object
    var val = $(e.target.form).validate();
    // now validate the target
    val.element($(e.target));
}
相关文章:
  • 没有找到相关文章