我正在制作一个通用控制器,它接收包含表名的字符串,然后显示列表页面。字段格式等显示参数在元数据中指定。
我的计划是使用一个控制器,一个视图用于列表,一个视图用于编辑所有实体。
列表的视图是这样的:
@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
指定,则会引发以下异常:
“ObjectContext 实例已被释放,不能再用于需要连接的操作。”
所以我的问题是:我应该使用任何其他元数据属性来指定特定实体的哪一列应该用于其显示值?我对Order
属性没问题,只是依赖用于其他字段的属性的最小值感觉很尴尬。