问题标签 [modelmetadata]

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 投票
2 回答
7832 浏览

asp.net-mvc - 如何覆盖实体框架验证错误消息

我有一个支持多个 ASP.NET MVC Web 应用程序的实体框架 4.1 模型。我使用 DataAnnotations 来定义和本地化标签文本和验证规则以及错误消息。

对于某些应用程序,我需要某些字段的标签文本不同于标准的模型定义文本。对于标签本身来说,这很容易实现:我从与视图关联的本地资源文件中检索我需要的文本。但是,标签文本也用于验证错误消息,例如“{fieldname} 的最大长度必须为 50 个字符”。

在不更改模型类上的注释的情况下更改验证消息的最佳方法是什么?

0 投票
0 回答
49 浏览

asp.net-mvc-3 - MVC 3,ModelMetadata 导航期间的奇怪行为

我的模型中的属性之一是用Hide属性装饰的。当我加载页面时,不显示此属性(如预期的那样)。当我单击“后退”然后单击“前进”按钮时,基本上是导航离开然后返回,然后显示此属性。当我进行刷新时,属性会被隐藏起来。为什么?

模型通过自定义编辑模板呈现。

0 投票
0 回答
471 浏览

asp.net-mvc - 在 HtmlHelper 中修改模型属性元数据

我正在尝试创建一个自定义 HtmlHelper,它显示格式化为给定小数位数的数值。我的想法是更改 ModelMetadata.DataFormatString 属性来实现这一点。是否可以以这种方式修改模型属性的元数据属性?我该怎么做?我的尝试(如下)没有按要求格式化数字。

我当然可以在同一个 HtmlHelper 中以不同的方式获取格式化值,但我特别想知道是否可以在运行时动态调整模型元数据。

0 投票
2 回答
2325 浏览

c# - 我可以在同一字段上多次使用 IMetadataAware 属性吗?

我有不同的人应该以不同的名称看到的字段。

例如,假设我有以下用户类型:

我实现了一个IMetadataAware属性:

这个想法是我可以根据需要覆盖其他值,但当我不这样做时,可以使用默认值。例如:

问题是当我有多个相同类型的属性时,DataAnnotationsModelMetadataProvider只运行OnMetadataCreated第一个。
在上面的示例中,Address只能显示为“地址”或“ADR”——其他属性永远不会执行。

如果我尝试使用不同的属性 - DisplayForUserType, DisplayForUserType2, DisplayForUserType3,一切都会按预期工作。

我在这里做错什么了吗?

0 投票
0 回答
88 浏览

lambda - 如何将 Lambda 表达式分解为组成表达式的对象?

给定一个表达式,例如:

m => m.Employee.Address.Line1

我需要创建一个函数,它可以遍历表达式,提取所涉及的对象,或者至少是链中的最终对象(即上面的地址对象)。所以对于上面的例子,函数会发现:

  • “这里”是 m 参数的实例(我可以从中获取类型)
  • “这里”是 Employee 成员的实例
  • (即重复链条)

目的是能够为“路径”生成配置信息。

如果我至少可以得到最终的“包含”对象,那么我可以产生类型信息,如果它支持特定的属性或方法,则可以调用该对象,以向对象请求额外的配置信息(以及要获取的对象类型)容器类型的配置信息)。

即使是稍微复杂一点的语句也会使这变得更加困难,例如:

m.Employee.Address[i].Line1

--- 只是为了提供一个我在 MVC 中为 BASIC 场景工作的示例。下面的 GetContainingModel() 在加载的 DataAnnotationsMetadataProvider 中的 CreateMetadata() 中被调用。传递给 CreateMetadata() 的模型是 Lambda 语句根的模型,并不是我们真正想要的。所以逻辑试图找到最终的包含对象。我宁愿不要像我正在做的那样使用反射,或者更糟的是,接触到一个私人成员(不好),但是......我愿意接受建议。

0 投票
1 回答
3186 浏览

asp.net-mvc - 如何在 EditorTemplate 中获取完全限定的成员名称?

我有一个 ASP.NET MVC 4 站点,我将一个嵌套属性传递给一个 EditorTemplate 并使用它构建字段名称ViewData.ModelMetadata.PropertyName,但这会获取子属性的属性名称,而不是我的属性的完整点符号名称编辑。

一个例子将最好地说明:

给定以下类型

我的编辑和创建视图如下:

_ImageUploader.cshtml 编辑器模板如下

呈现的 HTML 看起来像这样

请注意,在我调用的第 5 行和第 6 行ViewData.ModelMetadata.PropertyName,我只获得了子属性名称"ImageUrl",但我想要"Entity.ImageUrl"。如何获得这个完全限定的名称?

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 投票
0 回答
113 浏览

asp.net-mvc-3 - Modelmetadata 为外部模型填充,但不是内部模型,

我需要阅读有关如何填充模型元数据以及何时在框架中调用 OnMetadataCreated 方法的材料。当我创建一个包含嵌套视图模型的视图模型时,不会为内部视图模型的属性调用 OnMetadataCreated,而是为外部模型中的属性创建它。

我当前的解决方案通过在视图中使用反射来访问内部视图模型的属性和属性来规避这一点。(通常我会访问这些属性并在 OnMetadataCreated 中对它们进行处理。)

0 投票
1 回答
642 浏览

.net - 具有深度属性导航的 .NET 自定义强类型 HTML 助手

我四处搜索,阅读了所有与创建强类型助手相关的帖子,但没有一个解决我的问题。问题:

引用简单属性时,一切正常:

尝试访问模型中不同类的属性时,出现错误:

错误是:

找不到属性 InspectionEditViewModel.Person.BadgeNumber。

问题线是:

我猜这与 GetMetadataForProperty 无法在 InspectionEditViewModel 上找到 BadgeNumber 有关。默认情况下,MVC 的 HTML 助手可以毫无问题地做到这一点。

编辑:

我知道我遗漏了一些东西,这是漫长的一天。这是助手代码: