问题标签 [modelmetadataprovider]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1568 浏览

asp.net-mvc-2 - DataAnnotationsModelMetadataProvider 的源代码

出于某种原因,当我尝试反思此类时,.NET Reflector 会引发异常。它适用于其他一切。

请问源代码是DataAnnotationsModelMetadataProvider什么?

0 投票
2 回答
1419 浏览

asp.net-mvc - 在 MVC3 中使用 IoC 提供自定义 ModelMetadataProvider

我目前正在使用这个覆盖 Global.asax 文件中的默认 ModelMetadataProvider

这完美地工作。但我想使用 MVC3 的 IDependancyResolver 功能让 IoC 提供 ModelMetadataProvider 实现。我正在使用 StructureMap 来执行此操作(刚刚使用 NuGet 将其安装到项目中),但由于某种原因它没有按预期运行。

我在构造函数上放了一个断点,RedSandMetadataProvider()它被击中了。而且我还在自动添加的 SmDependencyResolver.cs 文件的函数上放置了一个断点,GetServices()以确保调用我的构造函数的是 IoC,并且一切看起来都很好,构造函数在我认为的第二页加载时被调用,但它从不调用我GetMetadataForProperty()的 MetadataProvider 的功能。现在我知道当我在 Global.asax 中设置它时会正确调用它,但是每次我尝试使用 IoC 实现相同的结果时,我都会看到在我的类上调用了构造函数,仅此而已。我尝试将 .Singleton() 添加到类型的 StrctureMap 注册中,这会导致我的构造函数更快地被调用,但它在构造后仍然从未真正使用过该对象。

我错过了什么吗?

0 投票
0 回答
1309 浏览

custom-attributes - 使用 CreateMetadata 自定义 ModelMetadata

当用户第一次从选择列表中选择一个值时,我们会显示一个带有 textPick one和 value的默认选项-1

为了帮助解决这个问题,我们有一个自定义属性NotEqualAttribute。当需要下拉列表时,我们必须使用这两个属性才能使其正常工作。

我们的虚拟机看起来像:

我们更喜欢使用这个:

另一个 StackOverflow 问题讨论了如何使不可为空的属性变为可选,除非该Required属性被显式设置

我尝试这样做,但很困惑如何将新属性添加到IEnumerable<Attribute>集合和/或将其添加到ModelMetadata元数据提供程序中:

0 投票
2 回答
508 浏览

asp.net-mvc-3 - 在 MVC 3.0 中,将 IsRequired 设置为属性的 ModelMetadata 时,它不会添加验证

我的应用程序中有某些属性需要动态设置,无论它们是否需要,因此我不能使用数据注释的 [Required] 属性。

也许这不是实现我想要的最佳方式。所以在这方面我会接受高兴的建议。我已经用以下内容覆盖了 DataAnnotationsModelMetadataProvider:

这只是一个概念测试,一旦我让它工作,我会将它更改为动态的和更面向对象的东西,但到目前为止,只要能够将属性 DataFieldValue 的 MetadataModel 设置为 IsRequired = true 我就可以开始了。

有了这个,我以动态方式成功地将 IsRequired 属性设置为 true (我想,这样就足够了!),当我在我的视图中调试时:

属性 DataFieldValue 声明如下:

我可以看到元数据的 IsRequired 属性为 true,但是当呈现“DataFieldValue”时,“验证器”不存在,当然验证不起作用。

为了确保我的项目配置没有问题,我检查了 web.config 并包含 javascripts 进行验证,所有配置都正确。更重要的是,如果我将所需的属性添加到我的属性中,如下所示:

验证工作完美!

谁能给我一个提示?或者告诉我我做错了什么?

谢谢!

0 投票
3 回答
5249 浏览

asp.net-mvc-3 - 使用 AutoMapper 将元数据传输到视图模型的技术

我使用 AutoMapper 将我的域对象映射到我的视图模型。我的域层中有元数据,我想将其转移到视图层和 ModelMetadata。(此元数据不是 UI 逻辑,而是为我的视图提供必要的信息)。

现在,我的解决方案是使用单独的 MetadataProvider(独立于 ASP.NET MVC),并使用约定通过 AssociatedMetadataProvider 将相关元数据应用于 ModelMetadata 对象。这种方法的问题在于,在绑定域中的 ModelMetadata 时,我必须测试与使用 AutoMapping 时相同的约定,而且似乎应该有一种方法可以使这更加正交。谁能推荐一个更好的方法来完成这个?

0 投票
1 回答
213 浏览

asp.net-mvc - JsonResult 的自定义模型元数据提供程序

我通过从DataAnnotationsModelMetadataProvider. GetMetadataforProperty自定义提供程序包含和的覆盖实现CreateMetadata

当我ActionResult从我的控制器类方法返回时,我的自定义元数据提供程序的代码将被执行。但是,如果我返回JsonResult,则不会命中自定义元数据提供程序代码。

我错过了什么吗?任何帮助,将不胜感激。

0 投票
1 回答
1740 浏览

asp.net-mvc - ASP.NET MVC 3 中的模型元数据提供程序是否支持动态元数据?

我正在尝试在 ASP.NET MVC 3 中实现一些自定义模型元数据。我不能使用数据注释属性,因为某些元数据可能会根据配置的值而改变,所以我需要一个解决方案,让我设置元数据每一个请求。我一直在阅读有关自定义模型元数据提供程序的信息,但我找不到任何有关支持动态元数据方案的信息。

MVC 框架是否缓存来自模型元数据提供程序的元数据,还是会在每个请求上调用 CreateMetadata 方法?自定义模型元数据提供程序是动态元数据的一个很好的解决方案,还是应该将它放在视图模型中?

编辑:这不一定是我正在谈论的验证元数据,所以我不是在寻找特定于验证的解决方案。它可能只是要被视图显示或使用的元数据(例如在 HTML 5 数据属性中)。

另一个示例可能是数据库驱动的字段标签。通常会使用 Display 属性的 Name 属性,但如果您想根据数据库中的值动态设置显示名称,这将不起作用。

0 投票
2 回答
2803 浏览

c# - 如何将元数据添加到动态构建的 MVC3 ViewModel?

我正在处理的一个项目的主要功能之一是用户能够基于预先存在的字段类型(例如众所周知的类型)配置表单(如在“表单”中填写) “用户名”、“出生日期”等,还有“通用类型”,如“字符串”、“日期时间”等)。

我们曾经有一个静态 ViewModel,它适用于“众所周知的”类型,看起来像这样:

列出了所有已知的属性,我们根据上下文显示或隐藏它们。

但是最后一个要求来了,改变了这一切。用户现在可以根据需要添加任意数量的泛型类型字段。为了做到这一点,我们决定让这个 InputModel 完全动态化。现在看起来像这样:

这就像一个魅力。razor 视图只需要遍历集合,为集合的每个属性创建相应的控件,而不是标准的方式:

...我们很好地将数据作为填充表格返回。

=> 这很好用,但我们没有任何客户端验证。为此,我们需要一些元数据......我们不再通过注释获得,因为我们正在动态创建模型。

为了提供这些元数据,我创建了一个CustomModelMetadataProvider继承自Global.asaxDataAnnotationsModelMetadataProvider并将其注册为新的。ModelMetadataProviderCreateMetadata()函数在创建 ViewModel 时被调用,并且对于我的 ViewModel 的每个属性......到目前为止都很好。

问题从哪里开始:为了向当前属性添加一些元数据,我首先需要确定我当前正在查看的属性(“名称”的最大长度为 200,“出生日期”没有,所以我无法分配默认情况下每个属性的最大长度)。不知何故,我还没有设法做到这一点,因为所有属性都具有相同的名称Value和相同的容器类型ModelProperty

我尝试通过反射访问属性的容器,但由于 ModelAccessor 的目标是 ViewModel 本身(因为 lambda 表达式m => m.Properties),以下构造为我提供了整个 ViewModel,而不仅仅是 ModelProperty:

我一直在翻来覆去,但找不到一种方法来识别我手头的 ModelProperty。有没有办法做到这一点?

更新:在所有可能的方向翻转了一段时间后,我们终于走了另一条路。我们基本上使用不显眼的 javascript 来使用 MVC 的验证功能,而无需触及属性或元数据。简而言之,我们将 HTML 属性value-data="true"(以及所有其他必需的属性)添加到@Html.TextBoxFor()语句中。这对于所有原子验证(必需、字符串长度等)都非常有效。

0 投票
1 回答
1248 浏览

asp.net-mvc - 在单元测试中使用自定义 ModelMetadataProvider

MVC 很新,所以希望这是一个简单的问题。

我编写了一个自定义绑定属性,需要访问httpContext. 为了httpContext在单元测试期间注入模拟,我编写了一个InjectingMetadataProvider填充Context我的任何自定义属性的属性。

我已经设法让它在以下测试中工作:

但是,如果我注释掉将 my 设置InjectingMetadataProvider为的行ModelMetadataProviders.Current,那么我的InjectingMetadataProvider.CreateMetadata()覆盖将获得一个空白的属性列表,因此测试失败,因为我的自定义属性没有设置它们的上下文。

为什么我需要将它设置为Current当我明确使用它时?我不想在我的测试中设置静态的东西。

我可能正在做一些愚蠢的事情,因为由于我对框架的不熟悉,我现在有点摸不着头脑。

0 投票
2 回答
4002 浏览

asp.net-mvc - 为 ViewModel 配置自定义 MetadataProvider

我有一个希望能够动态设置元数据属性的 ViewModel。例如,我希望能够使用其他模型属性的值自定义 DisplayName 和验证错误消息。根据Brad Wilson 的文章,我计划使用自定义 MetadataProvider 来执行此操作。

我希望提供程序仅与选定的 ViewModel 一起使用。所以我的问题是,我该如何配置?我已经看到使用 的示例ModelMetadataProviders.Current = new MyModelMetadataProvider(),但这可能会为所有模型类实体使用自定义提供程序。是否可以为单个 ViewModel 配置提供程序?