从 HTML 帮助程序中提取显示名称和描述属性

2023-11-25

我正在建立一个自定义HTML.LabelFor助手看起来像这样:

public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> self, Expression<Func<TModel, TValue>> expression, Boolean showToolTip)
{
  var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData);
  ...
}

为了能够获得该属性的正确名称,我使用以下代码:

metadata.DisplayName

在 ModelView 类的属性上我得到:

[DisplayName("Titel")]

问题是我还需要一个描述。有一个名为“显示”的属性,它具有名称和描述,但我不知道如何使用上面代码中的元数据变量来提取它?


免责声明:以下内容仅适用于 ASP.NET MVC 3(如果您使用的是以前的版本,请参阅底部的更新)

假设以下模型:

public class MyViewModel
{
    [Display(Description = "some description", Name = "some name")]
    public string SomeProperty { get; set; }
}

以及以下视图:

<%= Html.LabelFor(x => x.SomeProperty, true) %>

在您的自定义助手中,您可以从元数据中获取此信息:

public static MvcHtmlString LabelFor<TModel, TValue>(
    this HtmlHelper<TModel> self, 
    Expression<Func<TModel, TValue>> expression, 
    bool showToolTip
)
{
    var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData);
    var description = metadata.Description; // will equal "some description"
    var name = metadata.DisplayName; // will equal "some name"
    // TODO: do something with the name and the description
    ...
}

备注:有[DisplayName("foo")] and [Display(Name = "bar")]在同一模型属性上是多余的,并且在[Display]属性优先于metadata.DisplayName.


UPDATE:

我之前的答案不适用于 ASP.NET MVC 2.0。有几个属性无法默认填充DataAnnotations在 .NET 3.5 中,以及Description是其中之一。要在 ASP.NET MVC 2.0 中实现此目的,您可以使用自定义模型元数据提供程序:

public class DisplayMetaDataProvider : DataAnnotationsModelMetadataProvider
{
    protected override ModelMetadata CreateMetadata(
        IEnumerable<Attribute> attributes, 
        Type containerType,
        Func<object> modelAccessor, 
        Type modelType, 
        string propertyName
    )
    {
        var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);

        var displayAttribute = attributes.OfType<DisplayAttribute>().FirstOrDefault();
        if (displayAttribute != null)
        {
            metadata.Description = displayAttribute.Description;
            metadata.DisplayName = displayAttribute.Name;
        }
        return metadata;
    }
}

您将在其中注册Application_Start:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RegisterRoutes(RouteTable.Routes);
    ModelMetadataProviders.Current = new DisplayMetaDataProvider();
}

然后助手应该按预期工作:

public static MvcHtmlString LabelFor<TModel, TValue>(
    this HtmlHelper<TModel> self, 
    Expression<Func<TModel, TValue>> expression, 
    bool showToolTip
)
{
    var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData);
    var description = metadata.Description; // will equal "some description"
    var name = metadata.DisplayName; // will equal "some name"
    // TODO: do something with the name and the description
    ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 HTML 帮助程序中提取显示名称和描述属性 的相关文章

  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 将带有数组的对象转换为带有对象的数组的最佳方法,反之亦然

    将数组对象转换为对象数组的最佳方法是什么 反之亦然 category a b c title e f g code z x v To category a title e code z category b title f code x c
  • 如何仅为特定类配置log4j2.xml日志级别?

    In log4j可以通过以下方式定义日志级别package如下
  • 有没有办法在 Hive 中转置数据

    这是我的桌子 pid high medium low 1 10 8 6 2 20 16 12 3 10 6 4 我想将此数据存储在 Hive 中的另一个表中 格式如下 pid priority value 1 high 10 1 mediu
  • Django 中 null=True 和 Blank=True 有什么区别?

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 当我们在Django中添加模型字段时 我们通常会这样写 models CharField max length 100 nul
  • 使用 Google Analytics 将数据显示在我们的网页上?

    在我们的某些页面上 我们会显示一些统计信息 例如今天查看该页面的次数 过去一周查看该页面的次数等 此外 我们还有一个总体统计页面 我们按顺序列出页面 浏览次数最多的 今天 我们只是将这些页面浏览量和事件计数插入到我们的数据库中 我们还通过正
  • 被带有 selenium 和 chromedriver 的网站阻止

    我在尝试使用 chrome 驱动程序和 selenium 访问网站 bet365 com 时遇到一些麻烦 我完全被 阻止 我可以使用普通的 chrome 访问该网站 但是当我尝试使用 chrome 驱动程序时 它不起作用 我之前遇到过这个问
  • 世界时钟网络服务?

    您使用的最可靠的世界时钟网络服务是什么 不幸的是 你可能永远不会得到一个真正准确的原子钟网络服务由于消息 数据包从您的计算机到服务器来回传输的延迟问题 大多数可通过互联网访问的原子钟都使用一种称为网络时间协议其中包括一个抖动缓冲区 专门考虑
  • 如何使用 Dockerfile 在一层中复制多个文件?

    下列Dockerfile包含四个COPY layers COPY README md COPY package json COPY gulpfile js COPY BUILD NUMBER 如何使用一层复制这些文件 尝试了以下方法 COP
  • 所有 com.android.support 库必须使用完全相同的版本[重复]

    这个问题在这里已经有答案了 当我今天将 android studio 从版本 2 2 3 更新到 2 3 时 我突然在依赖项中的第一个编译行的 build gradle 中收到此错误 哪个依赖项首先出现并不重要 但它总是会给我这个错误 所有
  • NODE_PATH 无法识别

    这是我的package json script scripts start NODE PATH NODE PATH shared node dev npm run start webpack dev server progress colo
  • 将图像元数据与 tif 一起保存的最佳方法是什么?

    在我作为研究生的工作中 我捕获显微镜图像并使用 python 将它们保存为原始 tif 我想添加元数据 例如我正在使用的显微镜 的名称 放大倍数和成像激光波长 这些细节对于我如何后期处理图像都很重要 我应该能够用 tif 做到这一点 对吗
  • 如何将输出重定向到文件和标准输出

    在 bash 中 调用foo会在标准输出上显示该命令的任何输出 Calling foo gt output会将该命令的任何输出重定向到指定的文件 在本例中为 输出 有没有办法将输出重定向到文件and它显示在标准输出上吗 您想要的命令名为te
  • 在 .Net 3.5 应用程序中使用 Entity Framework 4.0 [重复]

    这个问题在这里已经有答案了 可能的重复 在 NET 3 5 SP1 上使用 EF 4 是否可以在 NET 3 5 应用程序中使用 Entity Framework v4 0 我的意思是 我可以只引用 EF 4 0 的相关程序集并在我的 NE
  • ssh 登录时的 .bashrc

    当我 ssh 进入运行 Hardy 8 04 的 ubuntu box 时 我的环境变量 bashrc未设置 如果我做一个来源 bashrc 变量设置正确 一切都很好 怎么会 bashrc不是在登录时运行吗 bashrc使用 SSH 登录时
  • R 中方差分析箱线图的事后标签

    如果我有一些数据并进行方差分析和事后测试 如何制作自动添加事后分类的箱线图 而不必在 R 之外编辑图形 例如 以下是一些入门数据 install packages reshape dependencies T library reshape
  • 解析 ps 的“etime”输出并将其转换为秒

    这些是可能的输出格式ps h eo etime 21 18 26 30 15 28 37 48 14 00 01 如何将它们解析为秒 请假设天数部分至少为 3 位数字 因为我不知道它可以有多长 输出将是egreped仅一行 因此无需循环 另
  • 你能帮忙把这个非常小的 C++ 组件翻译成 Delphi 吗?

    我正在将以下 C 组件翻译为 Delphi http borland newsgroups archived at public delphi vcl components using win32 200708 0708225318 htm
  • Ruby on Rails 工作流引擎(如 IBM WorkFlow)

    RoR中有工作流程实现吗 几年来 我使用 IBM WorkFlow 开发并支持 IBM Lotus Notes 企业应用程序 该软件提供了绘制业务流程方案的可能性 例如 某人创建文档并将其发送给另一名员工 另一名员工进行一些更改并将该文档发
  • 延迟评估索引序列类型

    我需要构建一系列从外部资源加载的对象 这种加载是一项昂贵的操作 需要延迟到需要对象时为止 构建集合后 我需要对所包含的对象进行索引访问 Scala 标准库是否提供适合此用例的集合 如果没有 实施它的最佳方法是什么 Edit 索引查找最好应该
  • 从 HTML 帮助程序中提取显示名称和描述属性

    我正在建立一个自定义HTML LabelFor助手看起来像这样 public static MvcHtmlString LabelFor