C#MVC:使用动态JsonString属性从C#对象创建表

时间:2017-02-06 06:59:00

标签: c# json asp.net-mvc

我的实习工作被分配了一个问题(至少对我而言)。该项目有一个C#对象,如下所示:

public class Person
{
    int Id { get; set; }
    string Name { get; set; }
    string OtherInfo { get; set; } //json string for a dynamic info
}

所以在数据库中,'table tblPersons类看起来像这样:

Id       Name            OtherInfo
1       John Doe        {"Gender":"Male","City":"New York"}
2       James Bradley   {"Gender":"Male","City":"Los Angeles"}

所以当我说“动态信息”时,我的意思是otherinfo列中json字符串的属性可能会改变。此属性在另一个名为“tblOtherInfoDetails”

的表中定义
Id          Name              Type
1         Gender             Text
2         City               Text

现在,我必须创建一个Persons列表,其中包含表中列的其他信息。像这样; (希望的HTML表格输出)

Id          Name              Gender            City
1         John Doe            Male              New York
2         James Bradley       Male              Los Angeles

但我很困惑如何做/显示这个。 我可以创建另一个类,如:

public class PersonsList
{
    string Name..
    string Gender..
    string City...
}

通过反序列化json字符串并在视图中添加要显示的名称来填充数据,但问题是当OtherInfo详细信息发生更改时,程序将不再起作用。我需要一些方法来动态创建动态类,可以由不同的属性填充并显示在屏幕上。但我很困惑如何做到这一点,或者如果可能,因为我只是新的C#。任何帮助或建议将受到高度赞赏..

1 个答案:

答案 0 :(得分:0)

嗯,我不确定,但可能你可以创建一个包含键值对列表的新模型。然后,您可以在tblOtherInfoDetails中搜索键,并从与其键匹配的反序列化对象中搜索值。然后在新制作的对象中插入键值。附上一段代码。

这是您的新模型类

    public class MyPerson
    {
    public int Id { get; set; }
    public string Name { get; set; }
    public Dictionary<string, string> KeyVal { get; set; }
    }

然后这就是你可能尝试或类似的东西

   public ActionResult Test()
    {
        MyPerson mp= new MyPerson();

        var myTestObj = db.Persons.Find(1);// Say for test you are picking the person obj where the primary key is 1.
        var testOtherInfo = db.tblOtherInfoDetailss.ToList();
        Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(myTestObj.OtherInfo);
        mp.Name = myTestObj.Name;
        mp.KeyVal = new Dictionary<string, string>();
        foreach (var i in testOtherInfo)
        {

            var value = values.Where(a => a.Key == i.Name).First().Value;

            mp.KeyVal.Add(i.Name, value);

        }
        return View(mp);
    }