MVC 3 - проверка для "isDateTime" не работает - PullRequest
2 голосов
/ 21 октября 2011

Я получил 2 поля DateTime, и я использую DatePicker для пользователя, чтобы выбрать дату. Однако, поскольку это текстовое поле, пользователь все равно может ввести любое значение и нажать кнопку «Отправить». Итак, я хочу провести проверку в текстовом поле DateTime, чтобы проверить, является ли отправленное значение DateTime с определенным форматом. Я попробовал это:

[Required(ErrorMessage = "Storage Date is required")]
[DataType(DataType.DateTime, ErrorMessage = "Please input a valid date")]
public DateTime StorageDate { get; set; }

Однако я не получаю никакого сообщения, даже если я ввожу «xxxxx» в текстовое поле и отправляю (Примечание: проверка [Обязательно] работает)

Моя форма такая:

<div class="editor-label">
    Storage Date
</div>
<div class="editor-field">
    @Html.TextBox("StorageDate", String.Format("{0:ddd, d MMM yyyy}", DateTime.Now), new { id = "storagedate" })
    @Html.ValidationMessageFor(model => model.StorageDate)
</div>

Итак, мне нужно проверить дату в соответствии с форматом. Любая идея, почему она не работает ???

Любая помощь очень ценится ... Спасибо ...

Ответы [ 2 ]

1 голос
/ 21 октября 2011

Вы можете добавить аннотацию регулярного выражения к свойству модели представления:

[RegularExpression("Expression_goes_here", "Date is of invalid format.")]

Вот ссылка на библиотеку REGEX - вы можете использовать одно из их выражений для проверкидата.

1 голос
/ 21 октября 2011

Чтобы проверить, что значение в текстовом поле является действительной датой, вам нужно добавить RegularExpressionAttribute с регулярным выражением для формата даты. Я использую пользовательский атрибут с регулярным выражением для проверки того, что строка имеет формат мм / дд / гггг.

public class DateAttribute : ValidationAttribute, IClientValidatable
{
    public DateAttribute()
    {
        ErrorMessage = "{0} is not a valid date";
    }

    private string _pattern = "^(((0?[1-9]|1[012])/(0?[1-9]|1\\d|2[0-8])|(0?[13456789]|1[012])/(29|30)|(0?[13578]|1[02])/31)/(19|[2-9]\\d)\\d{2}|0?2/29/((19|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|(([2468][048]|[3579][26])00)))$";

    private string _fieldLabel;
    public string FieldLabel
    {
        get { return _fieldLabel; }
        set { _fieldLabel = value; }
    }

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

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = FormatErrorMessage(_fieldLabel),
            ValidationType = "regex",
        };
        rule.ValidationParameters.Add("pattern", _pattern);
        yield return rule;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (String.IsNullOrEmpty(value.ToString()))
            return null;
        Regex regex = new Regex(_pattern);
        if (regex.IsMatch(value.ToString()))
            return null;

        return new ValidationResult(
            FormatErrorMessage(_fieldLabel)
        );
    }
}

Украсьте свойство с помощью [Дата], и все готово.

...