【发布时间】:2021-07-02 16:37:59
【问题描述】:
我有以下类定义
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 提取值,前提是我传递了对该属性的引用,我认为这会使视图中的代码看起来与内置的 ASP MVC 代码非常不同Html.TextBoxFor和Html.DisplayFor等
【问题讨论】:
标签: c# asp.net-mvc lambda reflection