【问题标题】:"This property setter is obsolete, because its value is derived from ModelMetadata.Model now."“这个属性设置器已经过时了,因为它的值现在是从 ModelMetadata.Model 派生的。”
【发布时间】:2009-10-07 13:51:15
【问题描述】:

http://www.asp.net/learn/mvc/tutorial-39-cs.aspx

我们正在使用上述指南在我们的 ASP.NET MVC 应用程序中实现一些验证。

我们收到以下错误This property setter is obsolete, because its value is derived from ModelMetadata.Model now.,它没有行号,它只是在按下提交按钮以创建新消息时爆炸。

我们不得不使用 MetaData 示例(参见上面指南的底部),因为对象是在 DBML 中生成的

关于导致错误的原因有什么建议吗?

【问题讨论】:

    标签: asp.net-mvc validation


    【解决方案1】:

    当您创建新的 ModelBindingContext 然后尝试在 MVC 2 预览版 2 或更高版本中设置 ModelType 属性时,您将收到此错误。例如,在自定义模型绑定器的单元测试中在旧版本的 MVC 中,我有如下代码:

        internal static T Bind<T>(string prefix, FormCollection collection, ModelStateDictionary modelState) where T:class
        {
            var mbc = new ModelBindingContext()
            {
                ModelName = prefix,
                ModelState = modelState,
                ModelType = typeof(T),
                ValueProvider = collection.ToValueProvider()
            };
            IModelBinder binder = new MyModelBinder();
            var cc = new ControllerContext();
            return binder.BindModel(cc, mbc) as T;
        }
    

    当我更新到 MVC 2 preview 2 时,我遇到了与您描述的相同的错误。解决方法是将此代码更改为:

        internal static T Bind<T>(string prefix, FormCollection collection, ModelStateDictionary modelState) where T:class
        {
            var mbc = new ModelBindingContext()
            {
                ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeof(T)),
                ModelName = prefix,
                ModelState = modelState,
                ValueProvider = collection.ToValueProvider()
            };
            IModelBinder binder = new MyModelBinder();
            var cc = new ControllerContext();
            return binder.BindModel(cc, mbc) as T;
        }
    

    请注意,我已删除 ModelType 的分配,并将其替换为对 ModelMetadata 的分配。 Visual Studio 应该会告诉您实际上是哪一行代码引发了此错误。

    【讨论】:

    • 我现在要试试这个,谢谢 - 如果没有你,我会在这里待一段时间。然而,这是一个错误吗?是不是我们做错了什么?
    • 补充一下,我在 Dll (Line 47 DataAnnotationsModelBinder.cs) ' var innerContext = new ModelBindingContext() { Model = propertyDescriptor.GetValue(bindingContext.Model), ModelName = fullPropertyKey, ModelState = bindingContext.ModelState, ModelType = propertyDescriptor.PropertyType, ValueProvider = bindingContext.ValueProvider };'
    • 这不是错误;这是一个功能变化。需要更改代码以支持 Preveiw 2。删除对 ModelType 的分配,并添加对 ModelMetadata 的分配。使用 GetMetadataForType(model, typeof(model.GetType())),其中 model 是您分配给 Model 属性的内容。
    • 是否有更新的验证方式?我必须获取这个 DLL 并重新生成它然后将其包含到 MVC 应用程序中,这似乎有点落后?
    • 是的,预览 2 内置了类似于数据注释活页夹的东西。请参阅:blogs.msdn.com/pietrobr/archive/2009/10/03/…
    猜你喜欢
    • 2020-09-04
    • 1970-01-01
    • 2014-03-14
    • 2013-01-18
    • 2021-09-15
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    相关资源
    最近更新 更多