asp.net core 2.0 IClientModelValidator, HtmlHelpers, LambdaExpression - PullRequest
0 голосов
/ 10 мая 2018

Я работаю над чистой проверкой клиента с помощью IClientModelValidator и Customs Html Helpers , чтобы применить стиль CSS в моем приложении.

Я нашел и реализовал этот интересный пример о проверке клиента и пользовательских DataAnnotations. ASP.Net Core MVC - проверка на стороне клиента для пользовательского атрибута

Это прекрасно, когда я использую помощник по умолчанию @ Html.TextBoxFor (m => m.TestCurrency)!

Теперь я хочу включить jquery-inputmask в моих пользовательских DataAnnotations. Для этого мне нужно добавить какой-то определенный класс CSS, например:

(Да, я могу просто добавить свой класс маски в пользовательский помощник, но у меня есть около 15 помощников: VEmailBoxFor, VPasswordFor, VPhoneNumberFor ... путем добавления класса в соответствии с пользовательской аннотацией DataAnnotation, которую я буду использовать только один помощник, действительно проще в обслуживании)

public void AddValidation(ClientModelValidationContext context)
{
    MergeAttribute(context.Attributes, "data-val", "true");
    var errorMessage = FormatErrorMessage(context.ModelMetadata.GetDisplayName());
    MergeAttribute(context.Attributes, "data-val-cannotbered", errorMessage);
    MergeAttribute(context.Attributes, "class", "currency");
}

Еще раз, когда я использую @ Html.TextBoxFor (), я обнаружил класс css "currency" в выводе, и проверка клиента также работает.

<input class="currency" data-val="true" data-val-cannotbered="Red is not allowed!" id="TestCurrency" name="TestCurrency" type="text" value="">

Но стиль по умолчанию не очень хорош, не так ли?

Как я уже сказал, я создал помощников, чтобы соответствовать начальной загрузке. Один из них выглядит так:

public static IHtmlContent VTextBoxFor<TModel, TResult>(this IHtmlHelper<TModel> helper, Expression<Func<TModel, TResult>> expression, object attributes)

Я добавляю все свои классы CSS и в конце я отображаю текстовое поле так:

return helper.TextBoxFor(expression, attributes);

Теперь моя проблема появляется:

<input class=" validate form-control " data-val="true" data-val-cannotbered="Red is not allowed!" id="TestCurrency" name="TestCurrency" type="text" value="">
  • Стиль выглядит хорошо
  • Проверка работоспособности клиента
  • Но мой класс "валюта" исчезла

Можно ли перехватить атрибуты "validation" / "html" из Expression<Func<TModel, TResult>> expression?

Извините за этот очень длинный пост, но это немного сложно для меня. Я надеюсь быть достаточно ясным.

Спасибо всем

...