ASP.NET MVC 2 Custom validation
От: Аноним  
Дата: 28.07.10 15:26
Оценка:
Есть кастомный аттрибут, вешается на класс(типа PropertiesMustMatch). Подскажите плис, как зарегить его клиентскую часть, чтобы она вызывалась по нажатию на кнопку сабмит.
Re: ASP.NET MVC 2 Custom validation
От: Gollum Россия  
Дата: 29.07.10 10:11
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Есть кастомный аттрибут, вешается на класс(типа PropertiesMustMatch). Подскажите плис, как зарегить его клиентскую часть, чтобы она вызывалась по нажатию на кнопку сабмит.


Вот пример создания пользовательского механизма валидации и регистрации его на клиенте.
... << RSDN@Home 1.2.0 alpha 4 rev. 1082>>
Eugene Agafonov on the .NET

Re[2]: ASP.NET MVC 2 Custom validation
От: Аноним  
Дата: 29.07.10 14:12
Оценка:
G>Вот пример создания пользовательского механизма валидации и регистрации его на клиенте.

Писал свой атрибут именно по этой статье. Проблема в том, что тут есть привязка к конкретному филду, а если просто зарегить свой валидатор — он не вызывается по сабмиту.
Re[3]: ASP.NET MVC 2 Custom validation
От: Gollum Россия  
Дата: 29.07.10 14:28
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Писал свой атрибут именно по этой статье. Проблема в том, что тут есть привязка к конкретному филду, а если просто зарегить свой валидатор — он не вызывается по сабмиту.


Понятно. Как доберусь, попробую сделать валидационный атрибут на класс и напишу что получится. В качестве проверки — попробуйте ваш атрибут навесить на свойство, если все заработает, то проблема скорее всего в недрах MVC.
... << RSDN@Home 1.2.0 alpha 4 rev. 1082>>
Eugene Agafonov on the .NET

Re[3]: ASP.NET MVC 2 Custom validation
От: Gollum Россия  
Дата: 30.07.10 13:27
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Писал свой атрибут именно по этой статье. Проблема в том, что тут есть привязка к конкретному филду, а если просто зарегить свой валидатор — он не вызывается по сабмиту.


Спасибо за хороший вопрос. Исследования показали, что при построении интерфейса-редактора с помощью шаблонных хелперов регистрация валидационных правил выполняется для каждого свойства, при этом атрибут на сам класс работать на сервере будет, но просто нету кода который бы регистрировал правило на клиенте.
Значит, нужно влезть куда-нибудь и добавить рендеринг валидационного правила. К сожалению, пока очевидного места не нашлось. Как возникнет время, попробую решить вопрос.

В качестве воркэраунда пока можно переделать на атрибут на одно из сравниваемых свойств, а не на класс.
... << RSDN@Home 1.2.0 alpha 4 rev. 1082>>
Eugene Agafonov on the .NET

Re[4]: ASP.NET MVC 2 Custom validation
От: Gollum Россия  
Дата: 31.07.10 09:22
Оценка:
Можно написать такое расширение к HtmlHelper

public static class HtmlHelperExtensions
{
  public static void RegisterModelLevelValidationRules(this HtmlHelper html)
  {
    var modelMetadata = html.ViewData.ModelMetadata;
    var formContext = html.ViewContext.FormContext;

    // create pseudo-field metadata
    var fieldMetadata = formContext.GetValidationMetadataForField(html.ViewData.ModelMetadata.GetDisplayName(), true);
    IEnumerable<ModelValidator> validators = ModelValidatorProviders.Providers.GetValidators(modelMetadata, html.ViewContext);
    foreach (ModelClientValidationRule rule in validators.SelectMany(v => v.GetClientValidationRules()))
    {
      fieldMetadata.ValidationRules.Add(rule);
    }
  }
}


и использовать его внутри формы (можно для удобства перед ValidationSummary)

<% Html.RegisterModelLevelValidationRules(); %>


то данные валидационного правила попадут на клиента. Более того, если вы обычным способом зарегистрируете клиентскую функцию, то она даже вызовется при отправке формы. Правда, тут начинаются проблемы с тем, что валидационное сообщение не будет показано, поэтому все-таки функцию лучше не регистрировать, а написать самому (например с помощью jQuery validation), используя данные валидационного правила.
... << RSDN@Home 1.2.0 alpha 4 rev. 1082>>
Eugene Agafonov on the .NET

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.