问题标签 [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 回答
3217 浏览

asp.net - ASP.NET MVC - 使用模型对象类型的模型元数据,而不是视图的声明模型

我声明了模型的接口,类实现了它:

我也有模型实现,具有不同的元数据:

我有 View,我在其中使用此模型界面:

我有控制器可以正确绑定和初始化模型:

问题:

如果在控制器的操作中返回具有 NOT NULL 模型的视图(return View(new MyModelImplementation(){...});),我在屏幕上看到的结果是:

在此处输入图像描述

但是,如果控制器的操作返回带有 null 模型的结果(return View(null);),那么结果是:

在此处输入图像描述

如您所见,Lambda html 帮助程序和字符串表达式帮助程序的行为是不同的,而且这些都不是一致的,并且某些行为看起来像一个错误:

  • (预期)对于 Lambda 助手,DisplayName 取自 IMyModel
  • (意外)对于字符串表达式,所有元数据都取自 MyModelImplementation 类(换句话说,如果您使用 Html.DisplayNameFor(m=>m.MyIntProperty) - 它显示来自接口的元数据(视图中声明的模型类型),但是如果您使用 Html .DisplayName("MyIntProperty") 它使用 model.GetType()) 的元数据。
  • (意外)所有验证规则和字符串总是取自 MyModelImplementation (model.GetType()) 元数据,而不是声明的模型类型 (IMyModel)。
  • (预期)对于字符串表达式帮助器模型的属性仅在传递给视图的模型为 NULL 的情况下取自接口
  • (意外)对于字符串表达式助手 SubModel 的属性元数据根本不被检索/尊重,以防传递给视图的模型为 NULL

问题:

此 ASP.NET MVC 错误/功能的最佳解决方法是什么?如何强制 Html 扩展始终使用默认情况下在视图中声明的模型类型的元数据?我尝试使用 MetadataTypeAttribute,但在这种情况下,实现模型的人将获得覆盖接口中指定的原始元数据的自由,这是我不想允许的。所以我宁愿寻找一些自定义的 ModelMetadataProvider 实现。在 MetadataType 的情况下,某些元数据属性也不受尊重,例如 RequiredAttribute。

0 投票
1 回答
1397 浏览

c# - ModelMetadata TemplateHint 始终为空

我正在尝试创建一个自定义ModelMetadataProvider来为 JQuery UI 自动完成小部件提供不显眼的属性。

我有一个看起来像这样的自定义属性:

和一个如下所示的编辑器模板:

我有一个视图模型,其类型属性string包括AutocompleteAttribute以下内容:

当我在我的视图中使用这个 viewModel 时,我检查生成的 html 并且我得到一个<input>具有如下属性的标签:data-autocomplete-url="UrlPlaceholder".

我接下来要做的是能够在我的视图中指定使用我的 viewModel 的 URL,如下所示:

我的AutoCompleteForUrl助手只是将生成的 URL 保存在字典中,使用属性名称作为键。

接下来我创建了一个自定义ModelMetadataProvider并使用这行代码在 global.asax 中注册它ModelMetadataProviders.Current = new CustomModelMetadataProvider();

我想要做的是将要由 JQuery UI 自动完成小部件使用的 URL 插入到要metadata.AdditionalValues由自动完成编辑器模板使用的字典中。

我的自定义ModelMetadataProvider看起来像这样:

我更新的编辑器模板如下所示:

问题是,TemplateHint在我的自定义模型元数据提供程序中,该属性永远不会等于“自动完成”,因此我生成 URL 的逻辑永远不会被调用。我会认为此时该属性将被设置为TemplateHint我称之为CreateMetadata.DataAnnotationsModelMetadataProvider

这是我可以确认的:

  • CustomModelMetadataProvider正确注册,因为它包含正在调用的其他代码。
  • 由于生成的 Html 包含一个名为"data-autocomplete-url".
  • 如果我在自动完成模板中放置一个断点,Visual Studio 会转到调试器。

那么任何人都可以为我解释一下吗?我对ModelMetadataProvider系统有什么误解?

0 投票
1 回答
1717 浏览

asp.net-mvc - 如何使用 AutoMapper 和 Betty 的方法将 DataAnnotation 元数据传输到 ViewModel

我需要澄清如何实现 Betty 的代码解决方案,以使用 AutoMapper 将数据注释元数据传输到 ViewModel(请参阅此处)。或者如果你有更好的方法,请分享。对于熟悉 AutoMapper 的人来说,也许 Betty 的答案的实现是显而易见的,但我是新手。

这是一个简单的例子,我应该在这段代码中添加什么来使 Betty 的解决方案起作用:

当前的 AutoMapper 实现:

我在 Application_Start 的 global.asax 中试过这个:

此外,我不得不从以下位置修改 Betty 的 GetMappedAttributes:

propertyMap.DestinationProperty.GetCustomAttributes至: propertyMap.DestinationProperty.MemberInfo.GetCustomAttributes

(或者不是 MemberInfo,它是 MemberType 吗?)甚至可以构建。

但似乎没有任何效果。

0 投票
1 回答
899 浏览

asp.net-mvc - ASP.NET MVC 5 / 元数据服务 - DataAnnotations - 这仍然是首选方式吗?

自版本 3 左右以来,我没有关注 ASP.NET MVC 的演变。那时在 MVC3 中,为 MVC DisplayNameFor 等魔法提升实体元数据信息的最简单/首选方法是使用 DataAnnotations。[MetadataType]如果类是代码生成的,则可能使用该属性。

我想知道这是否仍然是 MVC 5 中的首选方法(阅读 V4 和 V5 的新闻没有透露任何具体内容)或者现在有一些更可定制的(内置)元数据引擎。

我真正的问题是如何在不同的程序集中注释实体类。我的项目建立在 EDMX 文件和实体类存在于单独程序集中的方式上(由项目的 Web、PowerShell 等模块重用)

0 投票
1 回答
6919 浏览

asp.net-mvc - Add new Property to MVC ModelMetadata

I'm seeing alternative approaches to this such as AdditionalValues, but I'm wondering if it's possible to end up in a scenario where you can add a new property to the ModelMetadata object available in template views.

For example you could have:

I want to use this in Editor and Display templates to add MVVM attributes to the HTML elements being rendered.

I'm completely lost, but here are my efforts so far:

Then in global asax I use:

The problem is if I try to use MyProperty in the view it isn't recognized, which I anticipated because VS isn't aware of the custom ModelMetadata class.

I'm not even sure this is possible?

0 投票
0 回答
733 浏览

caching - 自定义模型元数据提供程序缓存问题

为了让我们能够动态控制标签和错误消息,我们创建了一个自定义的DataAnnotationsModelMetadataProvider. 在Display属性中,我们将键存储在Name属性中,并使用自定义DataAnnotationsModelMetadataProvider键替换自定义 CMS 中的字符串值。问题是我们现在有两组值。一种用于 Web 视图,另一种用于移动视图。在运行时,我们检查客户端是否在移动设备上并相应地替换这些值。

在测试运行此设置后,我遇到了一个奇怪的问题。当第AppDomain一次创建并将Name不同数据注释的属性替换为字符串值时,一切正常。在调试中,当我DataAnnotationsModelMetadataProvider第二次输入自定义项时,我看到名称属性已经填充了我替换前一次运行的值。这对我来说很奇怪,因为我的理解是数据注释属性不能在运行时更改。现在似乎某处发生了模型元数据缓存。由于我的自定义解决方案基于每次DataAnnotationsModelMetadataProvider调用时替换值,因此如果可能,我想禁用此缓存。

现在我开始使用该ShortName属性作为我的密钥存储属性并替换该Name属性,这样我可以在每次运行时重新填充字符串。但这不是最初的设计,我没有这样的密钥存储属性ValidationAttributes

那么有没有办法禁用这个缓存呢?为了缓存,我不需要缓存,因为所有 CMS 数据无论如何都缓存在另一层的内存中。

0 投票
1 回答
996 浏览

c# - ModelMetadata.Container 属性为空

我正在编写一个ModelMetadataProvider扩展 default的自定义DataAnnotationsModelMetadataProvider。不幸的是,我遇到了一个问题: ModelMetadata.Containerproperty 始终为 null。根据 msdn 的描述ModelMetadata Class,当 model 表示一个属性时,容器属性不应该为空:

在此处输入图像描述

但是在覆盖GetMetadataForProperty方法时,在调用基本实现 Container 属性后总是返回为 null:

在此处输入图像描述

另一方面,当从 访问ModelMetadataViewDataContainer属性按预期填充:

在此处输入图像描述

因此,我有几个与此问题相关的问题:

  1. ModelMetadata.Container 返回空的行为是预期的行为GetMetadataForProperty还是错误?

  2. 有没有办法ModelMetadata.Container在 ModelMetadataProvider 中填充属性?

  3. ModelMetadata.Container 属性何时真正获取它的内容?

0 投票
1 回答
1003 浏览

c# - 如何让验证器在 ASP.Net WebAPI 中实现 Fluentvalidation API

例子:

仅仅通过提供 UserController.Create() 方法和 UserViewModel 对象,如何获取 UserValidator 对象或类型?

0 投票
1 回答
1480 浏览

asp.net-mvc-3 - 在自定义显示名称属性中检索模型名称

这是我的开发要求,

我的标签值存储在数据库中,我仍然想以声明的方式使用数据注释,这是为了让我的模型更具可读性。

这是我的方法,

我决定编写自定义 DisplayNameAttribute,其中我的模型提供的默认值将被从数据库中检索到的值覆盖。

这是模型中定义的属性,

这是自定义显示名称属性类,

现在,您可以在上面的代码中看到,ModelName 是我需要的,但我没有!

在调试时,我深入研究了 ModelMetadataProviders.Current 并可以看到当前模型在运行中的可用性。但是,由于它是非公共静态成员的一部分,我无法通过我的代码访问它。

在此处输入图像描述

我编写了以下方法来通过反射检索模型名称,

但问题是,类型集合为我提供了所有模型的条目(用户至少访问过一次)。而且没有任何线索知道,目前正在行动!!

在此处输入图像描述

0 投票
0 回答
145 浏览

model-view-controller - 在 Automapper 5 中将元数据从实体复制到 ViewModel

在我的 MVC 应用程序中,我将 Autofac IoC 容器与 Automapper 一起使用。它让我有机会实现自定义 ViewModel。

主要问题:如何使用 Automapper 5.1.1 将元数据从实体复制到 ViewModel?

我尝试实施Bettys解决方案,但我无法使用这种方法正确注册新的提供者。

代码也如下所示:

或者

没有像 Mapper.Engine 这样的属性。

当我实施第二种方法时,我得到了无效的操作异常:

附加信息:映射器未初始化。使用适当的配置调用初始化。如果您尝试通过容器或其他方式使用映射器实例,请确保您没有对静态 Mapper.Map 方法的任何调用,并且如果您使用 ProjectTo 或 UseAsDataSource 扩展方法,请确保传入适当的 IConfigurationProvider实例。

那么,我应该如何初始化 AutoMapper.Mapper.Configuration?

提前感谢您的时间和帮助。

或者也许有另一种更好的方法来映射元数据和视图模型?