我有以下类定义
Person.cs
class Person {
[Column("first_name")]
public string FirstName { get; set; }
[Column("last_name")]
public string LastName { get; set; }
}我编写了一个HTML Helper扩展来从给定实例中提取ColumnAttribute值。然而,它并不像我期望的那样工作。
这是我尝试过的:
Index.cshtml
@model Person
<p>ColumnName is @Html.ColumnNameFor( model => model.FirstName )</p>HtmlExtensions.cs (公共静态类)
public static string ColumnNameFor<T, P>(this HtmlHelper<T> helper, Expression<Func<T, P>> expression)
{
var name = ExpressionHelper.GetExpressionText(expression);
var metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
// this line causes a runtime error:
// Sequence contains no elements
var attr = (ColumnAttribute)metadata.GetType().GetCustomAttributes(typeof(ColumnAttribute), false).First();
return attr.Name; // ColumnAttribute stores the value in .Name
}根据记录,我可以使用GetCustomAttributes提取值,前提是我传递了对该属性的引用,我认为这将使视图中的代码看起来与Html.TextBoxFor和Html.DisplayFor等的内置ASP代码非常不同。
发布于 2021-07-04 01:37:24
感谢@benuto的回答,我能够了解如何使用MemeberExpress提取任何所需的自定义属性或属性。我想要帮助别人的答案,所以我做了一个有效的例子。请记住,您需要检查对象是否具有自定义属性,以避免在访问FirstOrDefault().Name时崩溃。
public static string ColumnNameFor<T, P>( this HtmlHelper<T> helper,
Expression<Func<T, P>> expression)
{
var name = ExpressionHelper.GetExpressionText(expression);
MemberExpression me = expression.Body as MemberExpression;
var cp = (ColumnAttribute)me
.Member
.GetCustomAttributes(typeof(ColumnAttribute), false)
.FirstOrDefault();
return (cp == null) ? null : cp.Name;
}https://stackoverflow.com/questions/68228703
复制相似问题