我正在创建一个通用控制器,它接收包含表名的字符串,然后显示列表页面。显示参数(如字段格式)在元数据中指定。
我的计划是使用一个控制器,一个列表视图,一个视图用于编辑所有实体。
列表视图如下:
@model IEnumerable<IEnumerable<object>>
<table>
@foreach (var row in Model)
{
<tr>
@foreach (var item in row)
{
<td>@Html.DisplayFor(modelItem => item)</td>
}
</tr>
}
</table>
在控制器中,我使用反射从数据库中检索List<List<object>>
(用作类似于表的视图模型)。到目前为止一切都很好。
这些是两个DbSets
的元数据:
[MetadataType(typeof(AreaMetadata))]
public partial class Area
{
class AreaMetadata
{
[Key]
public Guid Id { get; set; }
[Display(Name = "Area Name", Order = 1)]
public string Name { get; set; }
[Display(Name = "Country", Order = 2)]
public Country Country { get; set; }
}
}
[MetadataType(typeof(CountryMetadata))]
public partial class Country
{
class CountryMetadata
{
[Key]
[Display(Name = "Id")]
public Guid Id { get; set; }
[Display(Name = "Country Name", Order = 1)]
public string Name { get; set; }
[Display(Name = "Letter Code", Order = 2)]
public string LetterCode { get; set; }
[Display(Name = "Numeric Code", Order = 3)]
public int NumericCode { get; set; }
}
}
当我将"Areas"
参数传递给我的控制器时,它会返回Areas
的表格,并且使用这些值显示各自的Countries
和Countries
Name
字段。
实验上我发现对于非原始类型(即依赖于连接的类型)DisplayFor()
在其元数据中的Order
中查找具有最小DisplayAttribute
值的字段并使用此字段作为Country
的显示值。
如果元数据中未指定Order
值或DisplayAttribute
,则会引发以下异常:
&#39; ObjectContext实例已被处理,不能再用于需要连接的操作。&#39;
所以我的问题是:我应该使用任何其他元数据属性来指定哪个特定实体的列应该用于其显示值?我对Order
属性没问题,依赖于用于其他字段的属性的最小值也感觉很尴尬。