Получить отображаемое значение аннотации в коде сервера mvc3 - PullRequest
3 голосов
/ 13 августа 2011

Есть ли способ получить значение аннотации в коде на стороне сервера? Например, у меня есть:

public class Dummy
{
    [Display(Name = "Foo")]
    public string foo { get; set; }

    [Display(Name = "Bar")]
    public string bar { get; set; }
}

Я хочу иметь возможность получить значение "Foo" на стороне сервера без отправки его обратно на страницу, но как атрибут класса или что-то в этом роде. Например, @Html.LabelFor (model => model.Foo) Но в коде сервера c #.

Это возможно?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 13 августа 2011

Как то так?

string displayName = GetDisplayName((Dummy x) => x.foo);

// ...

public static string GetDisplayName<T, U>(Expression<Func<T, U>> exp)
{
    var me = exp.Body as MemberExpression;
    if (me == null)
        throw new ArgumentException("Must be a MemberExpression.", "exp");

    var attr = me.Member
                 .GetCustomAttributes(typeof(DisplayAttribute), false)
                 .Cast<DisplayAttribute>()
                 .SingleOrDefault();

    return (attr != null) ? attr.Name : me.Member.Name;
}

Или, если вы хотите иметь возможность вызывать метод для экземпляра и использовать вывод типа:

var dummy = new Dummy();
string displayName = dummy.GetDisplayName(x => x.foo);

// ...

public static string GetDisplayName<T, U>(this T src, Expression<Func<T, U>> exp)
{
    var me = exp.Body as MemberExpression;
    if (me == null)
        throw new ArgumentException("Must be a MemberExpression.", "exp");

    var attr = me.Member
                 .GetCustomAttributes(typeof(DisplayAttribute), false)
                 .Cast<DisplayAttribute>()
                 .SingleOrDefault();

    return (attr != null) ? attr.Name : me.Member.Name;
}
3 голосов
/ 13 августа 2011

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

class Program
{
    static void Main(string[] args)
    {
        Dummy dummy = new Dummy();
        PropertyInfo[] properties = dummy.GetType().GetProperties();
        foreach (PropertyInfo property in properties)
        {
            IEnumerable<DisplayAttribute> displayAttributes = property.GetCustomAttributes(typeof(DisplayAttribute), false).Cast<DisplayAttribute>();
            foreach (DisplayAttribute displayAttribute in displayAttributes)
            {
                Console.WriteLine("Property {0} has display name {1}", property.Name, displayAttribute.Name);
            }
        }
        Console.ReadLine();
    }
}

public class Dummy
{
    [Display(Name = "Foo")]
    public string foo { get; set; }

    [Display(Name = "Bar")]
    public string bar { get; set; }
}

Это даст следующий результат:

http://www.codetunnel.com/content/images/reflectresult.jpg

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