【问题标题】:MVC 3 ValidationMessageFor() Does Not AppearMVC 3 ValidationMessageFor() 不出现
【发布时间】:2011-10-17 04:48:14
【问题描述】:

我想以 dd-mmm-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 类:

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-ppcdate 属性按预期显示...

<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>

有什么建议吗?

【问题讨论】:

  • 我很困惑,你不应该认为 @Html.EditorFor(model =&gt; model.EventDate , new { selectedDate = DateTime.Now }) 看起来像 EventDate 属性上的验证属性
  • 这眼光不错。我更新了问题。 ReceivedDate 是下一个属性。我试图使示例保持简洁并只关注一个属性。

标签: javascript jquery asp.net asp.net-mvc-3 jquery-validate


【解决方案1】:

您忘记注册规则并且您的自定义 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;
    }
});

这是完整的example

【讨论】:

  • 达林,你是个代码审查动物。我刚刚确定该方法没有触发。我跳过了规则分配 b/c 我没有任何要传递的参数——Stuart Leek 分配了一个本地参数对象。我将不得不重新阅读。我会仔细看看你的例子(我确实读过!)。非常感谢。
  • @Brett,如果你没有要传递的参数,你可以简单地传递true。就够了。
【解决方案2】:

加载 fiddler 并查看您的 CSS 文件是否未加载。我知道如果 CSS 未加载,摘要将不会显示,因此我必须假设这同样适用于单个验证项。

【讨论】:

  • Firebug 和 Fiddler 均未显示任何故障。我正在加载ajax.aspnetcdn.com/ajax/jquery.ui/1.8.10/themes/base/… 此外,正在输出“* require”消息。问题仅限于我自制的 PpcDate 属性...
  • ModelState.IsValid 是否显示为真?调用显式 TryUpdateModel 之后呢?
【解决方案3】:

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

Date.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));
}

【讨论】:

    猜你喜欢
    • 2013-05-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    相关资源
    最近更新 更多