【问题标题】:Custom HtmlHelper for changing labels用于更改标签的自定义 HtmlHelper
【发布时间】:2012-10-05 10:42:48
【问题描述】:

我想提供一种方法来更改与控件关联的标签,这些标签将通过查找 sql 表在页面上呈现。

理想情况下,我想注入元数据显示字段,然后使用帮助程序在页面上呈现。

@Html.LabelFor(m => m.city)

由于这需要在运行时进行 sql 查找,因此我不能只更改类脚手架 tt 模板以在设计时标记显示名称注释。

我想到了 3 种可能的方法。

  1. 重写所有我想使用的 html.helpers。这样做的问题是您需要在进行更改之前复制现有帮助程序的所有功能。

  2. 编写自定义数据注释并将其标记在类中的每个属性上,即

    [我的自定义名称属性] 公共字符串城市{得到;放; }

    然后希望在 MyCustomNameAttribute 类中我可以找到我所指的 linq 字段、对元数据模型的引用和使用这些的数据库上下文,我可以根据用户配置的潜在名称自定义来检索和替换 DisplayName。我试图这样做,但无法找出 [Display(Name="city")] 注释在后台如何工作。

  3. 修改实体模型支持代码以将名称注入元数据模型。

有人有以上经验吗?

干杯 蒂姆

【问题讨论】:

  • 您是否愿意为页面上的每个标签执行一个 SQL 查询?可能你需要引入内存缓存。

标签: asp.net-mvc entity-framework razor asp.net-mvc-4


【解决方案1】:

您必须通过扩展 DataAnnotationsModelMetadataProvider 来创建自定义 ModelMetaDataProvider

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

               if(meta.DisplayName == null)
               {
                 // TO DO read the display value from database and assign here
                 meta.DisplayName = .. 
               }

        return meta;
    }
}

然后你必须在 Global.asax.cs 中设置它

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

我假设您只想从 db 设置显示名称,但假设您想从 db 加载完整的模型元数据,那么我建议您通过实现抽象类 ModelMetadataProvider 创建自定义 ModelMetadataProvider

每次都访问数据库绝对不是一个好主意,所以我们必须尝试一些缓存策略。

我们必须为每个新的containerType(我猜)访问数据库,并读取容器的元数据信息及其所有属性,并使用containerType 的键将其存储在缓存中(这可能很难工作)。

【讨论】:

  • 非常有用的标记欢呼。在第一次请求时读取整个潜在的显示名称显然是有益的,而不是针对 20 个字段访问数据库 20 次。我不确定是否有明显的方法可以实现这一目标,
  • @Tim 我同意你的观点,在这种情况下我提供的解决方案很糟糕。我在问自己我是怎么忘记的。我会更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 2014-02-15
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多