Пользовательские DataAnnotation & ViewModels - PullRequest
2 голосов
/ 09 сентября 2011

Я написал пользовательскую аннотацию DataAnnotation, которая прекрасно работает, если только я не использую ViewModel, а не саму модель.

В случае с моделью аннотация данных дает эффект:

<label class="tooltip" for="title">Enter a title.</label>

Когда я использую ViewModel, аннотация данных все еще отображает то же самое.Проблема здесь в том, что «for» должно быть что-то вроде «Product_title» вместо «title».

Вот HTMLHelper, который я написал, который отображает метку из аннотации данных:

(взято из asp.net Расширение MVC DataAnnotions )

public static MvcHtmlString TooltipFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) {
    var exp = (MemberExpression)expression.Body;
    foreach (Attribute attribute in exp.Expression.Type.GetProperty(exp.Member.Name).GetCustomAttributes(false)) {
        if (typeof(Tooltip) == attribute.GetType()) {
            return MvcHtmlString.Create("<label class=\"tooltip\" for=\"" + exp.Member.Name + "\">" + ((Tooltip)attribute).Description + "</label>");
        }
    }
    return MvcHtmlString.Create("");
}

Я покопался в объекте выражения, чтобы выяснить, какое свойство содержит имя свойства модели, которое в итоге будет входным идентификатором;"exp.Member.Name".

Теперь, когда я использую ViewModel, мне, очевидно, нужно что-то другое, потому что "exp.Member.Name" по-прежнему возвращает "title" вместо "Product_title", чтов итоге становится идентификатором поля ввода.

Итак, есть ли свойство, которое я могу получить, которое я могу использовать вместо «Member.Name», которое всегда будет возвращать правильный идентификатор, или мне придетсяобойти эту проблему с помощью JavaScript (что я могу сделать, если ничего не помогает)?

1 Ответ

0 голосов
/ 20 февраля 2012

Недавно я реализовал нечто подобное, взяв атрибут «Описание» аннотации «Дисплей» и выведя его на экран:

    public static MvcHtmlString DescriptionFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression) {
        var metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
        var description = metadata.Description;

        return MvcHtmlString.Create(description);
    }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...