Получить экземпляр объекта из 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
вместо модели. Контакт. Остальное оставлено как упражнение для читателя;). Этот метод приходит, поскольку все решения, основанные на отражениях, выкапывают в непубличных данных без гарантии.
Ответ 2
Я не думаю, что ты можешь. Я спросил Брэда Уилсона (автора ModelMetadata
и др.) об этом напрямую, и он не мог придумать способ. В конце концов мне пришлось идти другим путем.
Ответ 3
Разве это не параметр modelAccessor
для?
Try:
var containerInstance = modelAccessor() as IUpdateable;