Получить экземпляр объекта из ModelMetadataProvider в ASP.NET MVC

Реализация пользовательского DataAnnotationsModelMetadataProvider в ASP.NET MVC2.

Предполагая, что объект, который отображается, выглядит следующим образом:

- Contact : IUpdateable
   - Name: string
   - ContactType: (Lead, Prospect, Customer)

а приведенный ниже метод находится в контексте Contact.ContactType, что означает:

  • meta.PropertyName == "ContactType"
  • meta.ContainerType == typeof(Contact)
  • meta.Model == ContactType.Lead

(код под вопросом:)

protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, 
    Type containerType,
    Func<object> modelAccessor, 
    Type modelType, string propertyName) {

    var containerInstance = meta.NotSureWhatGoesHere as IUpdateable;
    meta.IsReadOnly = containerInstance != null && containerInstance.CanBeUpdated(meta.PropertyName);
}

Вопрос. Как я могу получить экземпляр Contact из метаданных? (замените NotSureWhatGoesHere на правильный)?

Спасибо.

Ответы

Ответ 1

Грязный путь (проверенный в mvc3):

object target = modelAccessor.Target;
object container = target.GetType().GetField("container").GetValue(target);

Он вернет модель в   model = > model.Contact.Name вместо модели. Контакт. Остальное оставлено как упражнение для читателя;). Этот метод приходит, поскольку все решения, основанные на отражениях, выкапывают в непубличных данных без гарантии.

Ответ 3

Разве это не параметр modelAccessor для?

Try:

var containerInstance = modelAccessor() as IUpdateable;