【问题标题】:Json deserialization of database field and asp.net mvc数据库字段的Json反序列化和asp.net mvc
【发布时间】:2015-05-29 02:09:27
【问题描述】:

假设我有一个通用记录表(我首先使用的是 EF 代码),并且可以有许多不同类型的详细信息可用于此表:

class Record{
int Id,
int TypeOfDetails, // int enum Type1, Type2
string Details, //string with json content
string Attribute 1,
string Atribute 2,
...
}

class DetailsType1{
  string InternalAtribute1,
  ....
}

我决定使用 Json 将 Details 对象序列化到数据库字段中。 这允许在不更改数据库架构的情况下灵活处理不同的详细信息。

处理一个记录很容易,我知道 Details 对象的类型,所以我可以序列化和反序列化。

但是如何有效地检索多条记录并能够在 MVC 中引用详细信息? 假设我这样做:

var results = await context.Record.Where(..).ToAsyncList();

我希望能够在我的 .cshtml 中执行此操作:

@Html.DisplayFor(modelItem => item.Record.Details.InternalAtribute1)

基本上它会在运行中进行反序列化..

或者,如果在 AngularJS 中可以实现类似的功能,它也会有所帮助。

如果我对我的问题说清楚了,请告诉我。

【问题讨论】:

  • 不清楚你想要实现什么。你能更详细地解释一下你想在Details字段中保存什么吗?
  • 我想将对象 DetailsType1 保存为 json。可能还有DetailsType2和DetailsType3,所以我可以根据情况使用它们。
  • 为了说明我的第一个想法是: 1. 将 Object DetailsExpanded 字段添加到 [NoMapped] 的 Record 类中,这样就不会转到 db。然后创建将详细信息反序列化到此属性中的方法...不是很优雅也不是很有效,因为我需要循环执行此方法..

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


【解决方案1】:

我会回答我的问题。我发现最好的是:

    class Record{
    int Id { get; set; }
    int TypeOfDetails { get; set; } // int enum Type1, Type2
    string JsonDetails { get; set; } //string with json content
    string Attribute1 { get; set; }
    string Atribute2 { get; set; }
    ...
    [NotMapped]
    public JObject Details { get; set; }

    public void PopulateDetails()
    {
        Details = JObject.Parse(JsonDetails);
    }    
}

您仍然需要对所有查询结果执行 PopulateDetails,我在 foreach 循环中执行此操作。 然后在 CSHTML 中你可以这样做:

@item.Details["InternalAtribute1"])

可以显示您内部 Json 对象的详细信息。

【讨论】:

    猜你喜欢
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    相关资源
    最近更新 更多