【发布时间】:2014-01-31 20:16:02
【问题描述】:
我正在寻找在创建自定义属性时规避属性参数限制的方法。具体来说,我有一个自定义的 DisplayName 属性,它从数据库中检索数据,然后确定要在视图的 LabelFor 帮助器中显示什么。这是更大原型的一部分,因此代码改进现在是次要关注点。当我们准备好开始开发实际项目时,我们将实施缓存和其他性能改进。我可以为我的实际问题提供一些背景信息,但我希望答案足够笼统,可以适用于需要执行此操作的任何类型的属性。
构造函数除了给一些私有属性赋值外,不做任何工作:
public DisplayNameTranslationAttribute(string pageName = "", [CallerMemberName] string fieldName = "")
{
_pageName = pageName;
_fieldName = fieldName;
}
所有繁重的工作都发生在 DisplayName 覆盖方法中。这样做的原因是每次页面加载时都会调用 DisplayName,而不是在页面第一次加载时只调用一次然后再也不会调用的构造函数。
public override string DisplayName
{
get
{
string displayName = string.Empty;
_customerID = 1; //This needs be accessed or retrieved somehow, from somewhere
using (var db = new SomeDataEntities())
{
SomeData sd =
db.SomeDatas.FirstOrDefault(t => t.PageName == _pageName && t.FieldName == _fieldName);
SomeOtherData od = null;
if (sd != null)
{
od = sd.SomeOtherDatas.FirstOrDefault(c => c.CustomerID == _customerID);
displayName = Equals(od, null) ? sd.ColumnN : od.ColumnZ;
}
}
return displayName.IsNullOrWhiteSpace() ? _displayName : displayName;
}
}
如您所见,我现在将 _customerID 硬编码为 1。我需要能够为 _customerID 提供一个实际值。我知道我不能将它作为参数直接传递给属性,所以我需要做的是发现绕过这个限制的方法。是否有任何选项可以欺骗属性,或者更有可能从内存中的其他位置检索 ID?
【问题讨论】:
标签: c# asp.net-mvc model-view-controller custom-attributes