MVC 3 ValidationMessageFor () не появляется - PullRequest
1 голос
/ 17 октября 2011

Я бы хотел ввести даты в виде дд-ммм-гггг. Я использую следующий пост в качестве руководства:

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

Любой совет?

Ответы [ 3 ]

3 голосов
/ 17 октября 2011

Вы забыли зарегистрировать правило, и пользовательский метод проверки 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;
    }
});

Вот полный пример .

0 голосов
/ 17 октября 2011

Ответ Дарина объясняет, почему правило не стреляло. Еще одна странность заключается в том, что мне пришлось принудительно выполнять проверку при возникновении события 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));
}
0 голосов
/ 17 октября 2011

Загрузите Fiddler и посмотрите, не загружается ли ваш CSS-файл.Я знаю, что резюме не будет отображаться, если CSS не загружается, поэтому я должен предположить, что то же самое относится и к отдельным элементам проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...