Неверный рендеринг MVC DataAnnotation HTMLin MVC3

#asp.net-mvc #data-annotations

#asp.net-mvc #данные-аннотации

Вопрос:

У меня есть прямой объект модели, который выглядит следующим образом:

 [DataMember]
[DataType(DataType.Date)]
public DateTime WeekEndingDate { get; set; }
  

И страницу просмотра, которая делает это

  @Html.TextBoxFor(model => model.CashEntry.WeekEndingDate)
  

Но моя проблема в том, что он отображает это как разметку:

 <input data-val="true" data-val-required="The WeekEndingDate field is required." id="CashEntry_WeekEndingDate" name="CashEntry.WeekEndingDate" type="text" value="" />
  

Когда действительно требуется значение data-val, должно быть значение data-val-date . Это приводит к сбою проверки также на странице поля даты. Есть мысли относительно того, почему это может происходить?

Ответ №1:

Я боюсь ASP.NET MVC 3 никогда не создает data-val-date, вот список атрибутов, которые могут быть созданы:

  • значение данных-number
  • значение данных равно
  • значение данных-диапазон
  • значение данных-регулярное выражение
  • data-val-удаленный
  • требуется значение данных
  • значение длины данных

Вы можете создать дополнительный ModelValidatorProvider для атрибута DataType следующим образом:

 public class ClientDataTypeNameModelValidatorProvider : ModelValidatorProvider
{
    public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context)
    {
        if (metadata == null)
            throw new ArgumentNullException("metadata");

        if (context == null)
            throw new ArgumentNullException("context");

        if (metadata.DataTypeName == "Date")
            yield return new DateModelValidator(metadata, context);
    }

    internal sealed class DateModelValidator : ModelValidator
    {
        public DateModelValidator(ModelMetadata metadata, ControllerContext controllerContext)
            : base(metadata, controllerContext)
        { }

        public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
        {
            ModelClientValidationRule rule = new ModelClientValidationRule()
            {
                ValidationType = "date",
                ErrorMessage = "[Put your error message here]"
            };

            return new ModelClientValidationRule[] { rule };
        }

        public override IEnumerable<ModelValidationResult> Validate(object container)
        {
            // No server-side validation logic
            return Enumerable.Empty<ModelValidationResult>();
        }
    }
}
  

И зарегистрируйте его в своем Global.asax следующим образом:

 ModelValidatorProviders.Providers.Add(new ClientDataTypeNameModelValidatorProvider());
  

Это должно предоставить вам поддержку клиентской проверки для DataType.Date, но вы должны помнить, что это будет работать только с проверкой jQuery, поскольку проверка Microsoft не имеет правила для date.