MVC DataAnnotation рендеринг неверный HTML в MVC3 - PullRequest
0 голосов
/ 14 апреля 2011

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

[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 Ответ

2 голосов
/ 14 апреля 2011

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

  • Данные-валин-номер
  • Данные-валин-equalto
  • Данные-валин-диапазон
  • Данные-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 нет правила для даты.

...