【发布时间】:2020-08-12 04:47:55
【问题描述】:
我正在使用 ASP.NET 动态数据构建旧版应用程序。与往常一样,模型都是只读的,可以通过属性设置显示名称或描述。
这很好,但是,现在我需要查询两个不同的源(资源文件和其他一些源)以获取显示名称。
之前的代码是干净的,因为我们只查询了资源:
[Display(ResourceType = typeof(Resources.m_Res), Name = "M_RES_MIMETYPE_ID", Description = "M_RES_MIMETYPE_ID_DESCR")]
这完全没问题,并且按预期工作。但是,现在我必须首先从其他文件中获取显示名称和描述,如果其他一切都失败了,我必须回退到资源。
我必须以这种方式创建两个不同的自定义属性:
public class MGADisplayName : DisplayNameAttribute
{
private readonly string propertyName;
public string Name { get; set; }
public Type TableName { get; set; }
public Type ResourceType { get; set; }
public MGADisplayName([CallerMemberName] string PropertyName = null)
{
propertyName = PropertyName;
}
public override string DisplayName
{
get
{
var key = (TableName.Name + ":" + (propertyName ?? Name)).ToLower();
if (/* SOME QUERYING */)
{
return QUERY[key];
}
else
{
string property = Resources.m_Res.ResourceManager.GetString(Name);
if (property != null)
{
return property;
}
else
{
return Name;
}
}
}
}
}
这种工作,我想暂时还可以,但下一个问题指日可待:我需要对 Display.GroupName 做同样的事情。
现在,据我所知,没有要扩展的 GroupNameAttribute,所以我在这里有点摸不着头脑。
我希望我可以扩展 DisplayAttribute,这正是我需要的,但是这个类是密封的,所以这是一个死胡同。
我希望我可以即时更改模型并通过 setter 提供 DisplayName 和 Description,但模型只有 getter,所以这是另一个死胡同。
我这里的选项慢慢用完了。这里还能做什么?
【问题讨论】:
-
我没有意识到你为什么坚持扩展 .net 的预定义属性而不是创建全新的属性??!
-
因为我使用的是由 .net 创建的模型。这意味着默认情况下,每个 .aspx 模板都使用 GroupName 和 Description。我可以创建一个自定义 MyGroupNameAttribute,但 GroupName 值属性将被忽略。
-
在运行时添加属性会有帮助吗?
-
在这一点上,我并没有排除任何东西:)你有什么想法?
标签: c# asp.net custom-attributes asp.net-dynamic-data