ASP.NET MVC Проверка на стороне клиента с помощью MvcContrib FluentHtml

Каков рекомендуемый способ проверки на стороне клиента с использованием встроенного кода MVC2 со сборщиками FluentHtml MvcContrib? Мы используем код проверки JQuery на стороне клиента, а не стандартный Microsoft AJAX, если это имеет значение (хотя я не думаю, что это должно).

Похоже, что проверка на стороне клиента регистрируется в jQuery Validate только тогда, когда вы размещаете сообщение проверки (Html.ValidationMessageFor(x => x.FirstName)) на странице. MvcContrib's FluentHtml this.ValidationMessage(x => x.FirstName) работает только с ModelState на стороне сервера не выписывает HTML, если нет ошибки, и не регистрирует данное свойство с помощью jQuery Validate на стороне клиента.

Итак, мой вопрос: есть ли способ заставить текущую сборку магистрали MvContrib работать со встроенной проверкой на стороне клиента MVC2 несколько безболезненно прямо сейчас? Если так, то как? Если нет, то есть ли другая рекомендуемая проверка на стороне клиента (кроме xVal, которую мы используем в настоящее время и которая устарела)? Это должно быть исправлено в MvcContrib, чтобы он работал правильно? Последним средством было бы перейти на использование встроенных в ASP.NET MVC компоновщиков ввода, но мы уже вложили много средств в MvcContrib и не будем этого делать.

Спасибо!

2 ответа

Я получил комментарий от этой статьи блога, работающего Пола, и изменил его, чтобы использовать все известные адаптеры валидации MVC вместо обязательного (в основном имитируя большую часть того, что находится в самой платформе). Это выглядит немного странно из-за того, как оно отображает сообщение об ошибке и работает с тем, что у нас уже есть, и я реализовал патч для MVC Contrib, чтобы работать с ним, но в итоге я сейчас отказываюсь, пока MVC3 не будет завершен и MVC Contrib строит против этого. Нет смысла проходить через все это, когда скоро выйдет обновленная версия.

Вот чем я закончил (FluentViewPage<T> это где мы добавляем поведение):

public class ClientsideValidationBehavior<T> : IBehavior<IMemberElement> where T : class
{
    private readonly FluentViewPage<T> _viewPage;

    public ClientsideValidationBehavior(FluentViewPage<T> viewPage)
    {
        _viewPage = viewPage;
    }

    public void Execute(IMemberElement element)
    {
        var attribute = element.GetAttribute<ValidationAttribute>();

        if (attribute == null)
        {
            return;
        }

        var formContext = _viewPage.ViewContext.FormContext;
        var fieldMetadata = formContext.GetValidationMetadataForField(UiNameHelper.BuildNameFrom(element.ForMember), true);

        var modelMetadata = ModelMetadata.FromStringExpression(element.ForMember.Member.Name, _viewPage.ViewData);
        var validators = ModelValidatorProviders.Providers.GetValidators(modelMetadata, _viewPage.ViewContext);

        validators.SelectMany(v => v.GetClientValidationRules()).ForEach(fieldMetadata.ValidationRules.Add);

        fieldMetadata.ValidationMessageId = element.ForMember.Member.Name + "_Label";
    }
}

Надеюсь, что это помогает некоторым.

Я нахожусь в точно такой же ситуации... я наткнулся на этот пост с интересным комментарием ниже, хотя я не мог заставить его работать.

http://lunaverse.wordpress.com/2008/11/24/mvcfluenthtml-fluent-html-interface-for-ms-mvc/

Если у вас есть какой-то смысл, было бы неплохо опубликовать это здесь.

Павел

Другие вопросы по тегам