Есть кастомный аттрибут, вешается на класс(типа PropertiesMustMatch). Подскажите плис, как зарегить его клиентскую часть, чтобы она вызывалась по нажатию на кнопку сабмит.
Здравствуйте, <Аноним>, Вы писали:
А>Есть кастомный аттрибут, вешается на класс(типа PropertiesMustMatch). Подскажите плис, как зарегить его клиентскую часть, чтобы она вызывалась по нажатию на кнопку сабмит.
Вот
пример создания пользовательского механизма валидации и регистрации его на клиенте.
... << RSDN@Home 1.2.0 alpha 4 rev. 1082>>
G>Вот пример создания пользовательского механизма валидации и регистрации его на клиенте.
Писал свой атрибут именно по этой статье. Проблема в том, что тут есть привязка к конкретному филду, а если просто зарегить свой валидатор — он не вызывается по сабмиту.
Здравствуйте, <Аноним>, Вы писали:
А>Писал свой атрибут именно по этой статье. Проблема в том, что тут есть привязка к конкретному филду, а если просто зарегить свой валидатор — он не вызывается по сабмиту.
Понятно. Как доберусь, попробую сделать валидационный атрибут на класс и напишу что получится. В качестве проверки — попробуйте ваш атрибут навесить на свойство, если все заработает, то проблема скорее всего в недрах MVC.
... << RSDN@Home 1.2.0 alpha 4 rev. 1082>>
Здравствуйте, <Аноним>, Вы писали:
А>Писал свой атрибут именно по этой статье. Проблема в том, что тут есть привязка к конкретному филду, а если просто зарегить свой валидатор — он не вызывается по сабмиту.
Спасибо за хороший вопрос. Исследования показали, что при построении интерфейса-редактора с помощью шаблонных хелперов регистрация валидационных правил выполняется для каждого свойства, при этом атрибут на сам класс работать на сервере будет, но просто нету кода который бы регистрировал правило на клиенте.
Значит, нужно влезть куда-нибудь и добавить рендеринг валидационного правила. К сожалению, пока очевидного места не нашлось. Как возникнет время, попробую решить вопрос.
В качестве воркэраунда пока можно переделать на атрибут на одно из сравниваемых свойств, а не на класс.
... << RSDN@Home 1.2.0 alpha 4 rev. 1082>>
Можно написать такое расширение к 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>>