【问题标题】:Obtain containing object instance from ModelMetadataProvider in ASP.NET MVC从 ASP.NET MVC 中的 ModelMetadataProvider 获取包含对象实例
【发布时间】:2011-03-09 03:36:14
【问题描述】:

在 ASP.NET MVC2 中实现自定义 DataAnnotationsModelMetadataProvider

假设正在渲染的对象如下所示:

- 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);
}

问题:如何从元数据中获取联系人的实例? (把NotSureWhatGoesHere换成正确的)?

谢谢。

【问题讨论】:

    标签: c# .net asp.net asp.net-mvc


    【解决方案1】:

    肮脏的方式(在mvc3中测试):

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

    它将返回模型 模型 => 模型.联系人.姓名 而不是model.Contact。其余的留给读者作为练习;)。这种方法的出现,因为所有基于反射的解决方案都在非公开数据中四处寻找,没有保证。

    【讨论】:

    • 这是一个有趣的技巧!稍后会试一试。谢谢。
    • 它似乎比这更复杂。有必要遍历一个表达式树(并编译它的一部分)并根据我在 meta 中的信息神奇地找到容器。 Meta 没有提供有关可以识别所需容器实例的容器实例的任何详细信息(ContainerName 和类型不足以做到这一点,因为它们可以有很多)。
    • 对于其他采用此解决方案的人来说,它要么在 MVC2 中不起作用,要么比这复杂得多。我们最终选择了一条不同的路线,并没有修改元数据提供程序来访问实例值。
    【解决方案2】:

    【讨论】:

    • 非常感谢。听起来很令人失望。您知道在这方面从 MVC2 到 MVC3 是否发生了一些变化?
    • @Dmytrii,我还没有在 MVC 3 中看过这个。
    • 在 MVC3 或 MVC4 中这似乎没有改变。 CreateMetadata 方法仍然只传递容器类型,而不是实例。
    【解决方案3】:

    这不是modelAccessor参数的用途吗?

    试试:

    var containerInstance = modelAccessor() as IUpdateable;
    

    【讨论】:

    • 不,他在ContactType.Lead 的上下文中。在这种情况下,modelAccessor() 返回与 meta.Model 相同的内容;唯一的区别是如果modelAccessornull,您的代码将失败,但meta.Model 返回null。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 2015-08-19
    • 2014-02-03
    相关资源
    最近更新 更多