1

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

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

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

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

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

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

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

    [MyCustomNameAttribute] public string city{ get; 放; }

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

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

有没有人有以上经验?

干杯蒂姆

4

1 回答 1

1

您必须ModelMetaDataProvider通过扩展DataAnnotationsModelMetadataProvider.

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(我猜)访问数据库,并读取容器的元数据信息及其所有属性,并以 key 作为存储在缓存中containerType(这可能是一项艰巨的工作)。

于 2012-10-05T11:13:05.053 回答