ASP.NET MVC Проверка на стороне клиента с помощью MvcContrib FluentHtml - PullRequest
1 голос
/ 05 ноября 2010

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

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

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 ноября 2010

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

Вот что я закончил (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";
    }
}

Надеюсь, что это поможетнекоторые из них.

0 голосов
/ 06 ноября 2010

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

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

ЕслиВы можете понять, что было бы неплохо опубликовать это здесь.

Пол

...