我正在设置自定义属性以保护视图中的对象。这是我的自定义属性的定义:
[AttributeUsage(AttributeTargets.Property)]
public class SecureObjectAttribute : Attribute, IMetadataAware
{
public void OnMetadataCreated(ModelMetadata metadata)
{
if(!metadata.AdditionalValues.ContainsKey("isSecure"))
{
if (ObjectId == 1)
{
metadata.AdditionalValues.Add("isSecure", true);
}
else
{
metadata.AdditionalValues.Add("isSecure", false);
}
}
}
public int ObjectId { get; set; }
}
这是我的视图模型:
public class HomeViewModel
{
[SecureObject(ObjectId = 1)]
[Display(Name = "Name")]
public string Name { get; set; }
[Display(Name = "Address")]
public string Address { get; set; }
}
我正在为安全标签和安全文本框定义助手。这是我的辅助函数:
public static MvcHtmlString SecureLabelFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
if ((bool)metadata.AdditionalValues["isSecure"])
{
return null;
}
else
{
return html.LabelFor(expression);
}
}
public static MvcHtmlString SecureTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
if ((bool)metadata.AdditionalValues["isSecure"])
{
return null;
}
else
{
return html.TextBoxFor(expression);
}
}
所有这些都正常工作,但是,我遇到的问题是每次定义安全标签和安全文本框时,都会调用 OnMetadataCreated 方法。
我正在 OnMetadataCreated 方法(示例中未显示)上访问数据库以获取对象的权限,并且我想避免单个对象的重复行程。
以下是导致 OnMetadataCreated 在我的视图中被调用两次的代码示例:
@Html.SecureLabelFor(m => m.Name) @Html.SecureTextBoxFor(m => m.Name)
关于如何避免第二次调用 OnMetadataCreated 方法或避免重复访问数据库的任何建议?