Проверка типа на стороне клиента не работает в MVC 2 - PullRequest
2 голосов
/ 22 ноября 2011

У нас есть атрибут с именем DateReleased, для которого добавляются следующие атрибуты аннотации данных

[Required]
[DataType(DataType.Date, ErrorMessage = "Please enter date")]
[DisplayName("Date Released")]
public object DateReleased { get; set; }

Ниже приводится действие, которое реализовано для вставки новой записи в базу данных

[HttpPost]
public ActionResult Create([Bind(Exclude="Id")] Movie movie)
{
    try
    {
        if (ModelState.IsValid)
        {
            _entities.AddToMovies(movie);
            _entities.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(movie);
    }
    catch
    {
        return View();
    }
}

Я включил проверку клиента, разместив следующие строки кода в представлении создания

<script type="text/javascript" src="../../Scripts/jquery-1.4.1.min.js"></script>
<script type="text/javascript" src="../../Scripts/jquery.validate.js"></script>
<script type="text/javascript" src="../../Scripts/MicrosoftAjax.js"></script>
<script type="text/javascript" src="../../Scripts/MicrosoftMvcAjax.js"></script>
<script type="text/javascript" src="../../Scripts/MicrosoftMvcValidation.js"></script>

<% Html.EnableClientValidation(); %>

Но я был удивлен, обнаружив, что только Обязательная проверка запускается на стороне клиента.Проверка типа данных Date запускается только на стороне сервера.Пожалуйста, дайте мне знать причину сбоя проверки на стороне клиента и какие обходные пути для запуска проверки на стороне клиента.

Ответы [ 2 ]

4 голосов
/ 24 ноября 2011

Да.Добавьте пользовательский класс атрибута, как показано ниже

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class DateAttribute : DataTypeAttribute
{
    public DateAttribute() : base(DataType.Date) { }

    public override string FormatErrorMessage(string name)
    {
        if (ErrorMessage == null && ErrorMessageResourceName == null)
        {
            ErrorMessage = ValidatorResources.DateAttribute_Invalid;
        }
        return base.FormatErrorMessage(name);
    }

    public override bool IsValid(object value)
    {
        if (value == null) return true;
        DateTime retDate;
        return DateTime.TryParse(Convert.ToString(value), out retDate);
    }
}

Создать класс правила проверки клиента

public class ModelClientValidationDateRule:ModelClientValidationRule
{
    public ModelClientValidationDateRule(string errorMessage)
    {
        ErrorMessage = errorMessage;
        ValidationType = "date";
    }
}

Создайте класс адаптера, который подключает пользовательский атрибут и правило проверки клиента, как показано ниже.Убедитесь, что вы добавили ссылку на указанный выше класс атрибута

public class DateAttributeAdapter : DataAnnotationsModelValidator<DateAttribute>
{
    public DateAttributeAdapter(ModelMetadata metadata, ControllerContext context, DateAttribute attribute)
        : base(metadata, context, attribute) { }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        return new[] { new ModelClientValidationDateRule(ErrorMessage) };
    }
}

Затем измените файл global.asax

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterRoutes(RouteTable.Routes);

    DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(DateAttribute), typeof(DateAttributeAdapter));
}

Добавление атрибута в класс модели, как показано ниже

[Date]
public object DateReleased { get; set; }

Добавление следующего кода на стороне клиента в представлении

<script type="text/javascript" src="../../Scripts/jquery-1.4.1.min.js"></script>
<script type="text/javascript" src="../../Scripts/jquery.validate.js"></script>
<script type="text/javascript" src="../../Scripts/MicrosoftAjax.js"></script>
<script type="text/javascript" src="../../Scripts/MicrosoftMvcAjax.js"></script>
<script type="text/javascript" src="../../Scripts/MicrosoftMvcValidation.js"></script>
<script type="text/javascript">

Sys.Mvc.ValidatorRegistry.validators["date"] = function (rule) {
    // initialization code can go here.
    return function (value, context) {
        if (value.length > 0) {
            var d = new Date(value);
            if (!isNaN(d))
                return true;
            return rule.ErrorMessage;
        }
        else {
            return true;
        }
    };
};

Надеюсь, это поможет вам.

3 голосов
/ 22 ноября 2011

DataTypeAttribute не выполняет проверку.Он действительно используется только для выбора шаблонов Editor / DisplayTemplates (и, таким образом, контролирует форматирование данных), а также для форматирования выделения в общих шаблонах.

Я не уверен, почему вы подумали, что это произвело какую-либо проверку,но это не так.Что контролирует валидацию - это фактический тип данных.Так как вы создали свой элемент данных как object, он не может проверять формат даты.Вместо этого сделайте ваши свойства типа DateTime?или Nullable

...