将单个实体Framework对象转换为字典

时间:2012-01-04 17:58:56

标签: c# asp.net-mvc entity-framework-4

我有以下问题。我在实体框架模型中有一个类,它具有属性,例如:

class Company{
    public string Name {get; set};
    public string Address {get; set};
    public string Email{get; set};
    public string WebSite {get; set};
}

我在数据库中有配置,用于定义是否应显示某个字段,例如:

  • 姓名:show
  • 地址:show
  • 电子邮件:隐藏
  • 网站:隐藏

这是动态的,所有字段都按名称引用。

当我在视图中显示对象时。将单个对象转换为某个字符会很好,其中键将是属性名称,值将是属性值,因此我可以按名称检查每个字段是否应该显示(可能在某些for-each循环中)例如:

CompanyDetails.cshtml

<h2>Company Details</h2>
@foreach(var property in modelDictionary.Keys){

    @if(IsVisible(property))
        @Html.Raw( modelDictionary[property] )
}

将单个对象从实体框架模型转换为属性字典的最佳方法是什么?我应该在控制器动作中将它从对象转换为字典,还是在视图中以某种方式使用模型元数据?

我可以在Company类上使用反射并查找类中的所有属性,这样我就可以填充字典了,但这看起来像是太老派的解决方案,所以我徘徊有没有更好的方法来做到这一点?

由于

2 个答案:

答案 0 :(得分:2)

您可以使用RouteValueDictionary,它允许您将对象转换为字典:

public class Company
{
    public string Name { get; set; }
    public string Address { get; set; }
    public string Email { get; set; }
    public string WebSite { get; set; }
}

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new Company
        {
            Address = "some address",
            Email = "some email",
            Name = "some name",
            WebSite = "some website"
        };
        return View(new RouteValueDictionary(model));
    }
}

并在视图中:

@model RouteValueDictionary

<h2>Company Details</h2>
@foreach (var item in Model)
{
    if (IsVisible(item.Key))
    {
        <div>@item.Value</div>
    }
}

答案 1 :(得分:1)

您可以在实体上实现索引器,并将反射映射到实体中的某个属性。

类似的东西:

class Entity
{
    public bool this[int index] 
    {
        get 
        {
           // Select all properties, order by name and return the property index
        }
   }

    public bool this[string name] 
    {
        get 
        {
           // Select all properties and return the correct one.
        }
   }
}