Получение атрибута из параметра в помощнике HTML - PullRequest
4 голосов
/ 14 ноября 2011

Итак, допустим, у меня есть небольшой объект модели, который содержит обязательную строку и максимальную длину 50:

public class ObjectModel
{
    [Required]
    [MaxLength(50)]
    public string Name { get; set; }
}

Мне нужно создать собственный помощник HTML, где я могу передать строку(в данном случае ObjectModel.Name) и, если требуется, создайте элемент ввода HTML с классом «required».

Сейчас я пытаюсь работать с:

 public static HtmlString Input(string label)
 {
     return new HtmlString("<input type=\"text\" />");
 }

Так что в моем представлении Razor, если я делаю что-то вроде @InputHelper.Input(Model.Name), я не могу получить доступ к атрибутам.У меня вопрос: как мне структурировать мой вспомогательный класс HTML, чтобы он принимал свойство Model вместе с его атрибутами?

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

@InputHelper.Input(m => Model.Title.TitleName, "titlename2", "Title Name")

Второй и третий параметры не имеют отношения к этому вопросу.И в вспомогательном методе у меня есть:

public static HtmlString Input(Expression<Func<string, Object>> expression, string id, string label)

Но когда я иду к отладке кода, есть так много объектов и свойств, которые нужно просеять, и я понятия не имею, где мойОбязательные атрибуты и атрибуты MaxLength есть, даже если они там есть.

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

Вы можете получить атрибуты Required и MaxLength, используя следующий метод расширения:

public static class ExpressionExtensions
{
    public static TAttribute GetAttribute<TIn, TOut, TAttribute>(this Expression<Func<TIn, TOut>> expression) where TAttribute : Attribute
    {
        var memberExpression = expression.Body as MemberExpression;
        var attributes = memberExpression.Member.GetCustomAttributes(typeof(TAttribute), true);
        return attributes.Length > 0 ? attributes[0] as TAttribute : null;
    }
}

Тогда из своего кода вы можете сделать:

public static HtmlString Input(Expression<Func<string, Object>> expression, string id, string label)
{
    var requiredAttribute = expression.GetAttribute<string, object, RequiredAttribute>();
    if (requiredAttribute != null) 
    {
        // some code here
    }
}
0 голосов
/ 14 ноября 2011

Вы должны посмотреть, что они сделали с .NET Framework.Создайте метод, который принимает Expression>, а затем используйте код для извлечения имени свойства из помощника:

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