Не удается получить значение пользовательского атрибута в HTML-помощнике MVC3 - PullRequest
5 голосов
/ 28 октября 2011

Я добавил в помощник HTML метод, которому требуется значение атрибута из свойства модели.Итак, я определил пользовательский атрибут как таковой.

    public class ChangeLogFieldAttribute : Attribute {
        public string FieldName { get; set; }
    }

Он используется так в моей модели.

    [Display(Name = "Style")]
    [ChangeLogField(FieldName = "styleid")]
    public string Style { get; set; }

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

        var itemName = ((MemberExpression)ex.Body).Member.Name;

        var containerType = html.ViewData.ModelMetadata.ContainerType;
        var attribute = ((ChangeLogFieldAttribute[])containerType.GetProperty(html.ViewData.ModelMetadata.PropertyName).GetCustomAttributes(typeof(ChangeLogFieldAttribute), false)).FirstOrDefault();
        if (attribute != null) {
            itemName = attribute.FieldName;
        }

Однако, когда я достигаю этого кода, я получаю исключение, потому что containerType имеет значение null.

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

Спасибо.

ОБНОВЛЕНИЕ С РЕШЕНИЕМ

Я использовалРешение Дарина Димитрова, хотя мне пришлось немного его подправить.Вот что я добавил.Я должен был проверить наличие атрибута metatdata, и все было хорошо.

        var fieldName = ((MemberExpression)ex.Body).Member.Name;

        var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData);
        if (metadata.AdditionalValues.ContainsKey("fieldName")) { 
            fieldName = (string)metadata.AdditionalValues["fieldName"];
        }

1 Ответ

11 голосов
/ 28 октября 2011

Вы можете сделать метаданные атрибута осведомленными:

public class ChangeLogFieldAttribute : Attribute, IMetadataAware
{
    public string FieldName { get; set; }

    public void OnMetadataCreated(ModelMetadata metadata)
    {
        metadata.AdditionalValues["fieldName"] = FieldName;
    }
}

и затем внутри помощника:

var metadata = ModelMetadata.FromLambdaExpression(ex, htmlHelper.ViewData);
var fieldName = metadata.AdditionalValues["fieldName"];
...