Пользовательский формат ввода даты в веб-приложении .net MVC3 Entity Framework? - PullRequest
0 голосов
/ 19 сентября 2011

У меня есть требование, чтобы пользователям разрешалось вводить даты в формате «гггммд», всего 6 цифр в текстовом поле.

Форма отправляется через ненавязчивый ajax на контроллер / действие mvc3,сохраняет это в базе данных mysql через Entity Framework 4.1.Принудительно он сохраняет дату как ноль, если я ввожу дату в желаемом формате "гггдд".

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

Дата в модели указана как

public class CustomDate {
  [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyMMdd}")]
  //[RegularExpression(@"^[0-9]{6}$")]
  public DateTime? Something { get; set; } 
}

У действия, поддерживающего форму, естьследующая подпись.

public JsonResult NewClaim(CustomDate d) {
db.CustomDate.Add.(d);
db.SaveChanges();
}

1 Ответ

1 голос
/ 19 сентября 2011

Вы можете написать пользовательский механизм связывания для проверки на стороне сервера:

public class DateModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (value == null) 
        {
            return null;
        }

        var format = bindingContext.ModelMetadata.EditFormatString ?? string.Empty;
        format = format.Replace("{0:", string.Empty).Replace("}", string.Empty);
        if (!string.IsNullOrEmpty(format))
        {
            DateTime date;
            if (DateTime.TryParseExact(value.AttemptedValue, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
            {
                return date;
            }
        }
        return base.BindModel(controllerContext, bindingContext);
    }
}

, который вы зарегистрируете в Application_Start:

ModelBinders.Binders.Add(typeof(DateTime?), new DateModelBinder());

Для проверки на стороне клиента естьразличные методы, которые могут быть использованы.Например, вы можете обработать это вручную:

<script>
    $.validator.addMethod('myDate', function (value, element) {
        // TODO: validate if the value corresponds to the required format
        // and return true or false based on it
        return false;
    }, 'Please enter a date in the format yyMMdd');

    $(function () {
        // Attach the myDate custom rule to the #Something element
        $('#Something').rules('add', 'myDate');
    });
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...