【问题标题】:Why is Custom DataAnnotationsModelMetadataProvider's CreateMetadata never being called?为什么从未调用自定义 DataAnnotationsModelMetadataProvider 的 CreateMetadata?
【发布时间】:2018-02-09 22:57:46
【问题描述】:

我通过继承 DataAnnotationsModelMetadataProvider 并覆盖 CreateMetadata 方法创建了一个自定义提供程序:

public class CustomMetadataProvider : DataAnnotationsModelMetadataProvider
{
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, 
        Type containerType, Func<object> modelAccessor, 
        Type modelType, string propertyName)
    {
        //... code not included for brevity but execution never gets here
    }
}

然后我在Global.asaxMvcApplication类中注册了它:

public class MvcApplication : HttpApplication
{
    protected void Application_Start()
    {
        // Other code...
        System.Web.ModelBinding.ModelMetadataProviders.Current = 
            new CustomMetadataProvider();
    }
}

我放了一个断点,上面的注册正在执行,Current 正在设置中。

问题/疑问

永远不会调用CreateMetadata 方法。我还需要做什么?

【问题讨论】:

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


    【解决方案1】:

    您在Global.asax.cs 文件中设置了错误的属性。而不是:

    System.Web.ModelBinding.ModelMetadataProviders.Current = 
            new CustomMetadataProvider();
    

    应该是这样的:

    ModelMetadataProviders.Current = 
            new CustomMetadataProvider();
    

    如果你真的想提供完整的限定词,实际上是:

    System.Web.Mvc.ModelMetadataProviders.Current = 
            new CustomMetadataProvider();
    

    【讨论】:

    • 我已经尝试过了,实际上并不是这样。这会给你这个错误:Cannot implicitly convert type 'CustomMetadataProvider' to 'System.Web.Mvc.ModelMetadataProvider'
    • 这很奇怪,你确定你的类继承自DataAnnotationsModelMetadataProvider吗?尝试使用填充命名空间System.Web.Mvc.DataAnnotationsModelMetadataProvider
    • 谢谢!是的你是对的。但是你是怎么知道的,我花了几个小时寻找这个。
    • 多年的经验,数千小时的 Google-fu 练习和一点点从旧项目中获得的 sn-p 代码 ;)
    猜你喜欢
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 2013-12-04
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多