【问题标题】:How to display complex class data in ASP.NET Core如何在 ASP.NET Core 中显示复杂的类数据
【发布时间】:2021-11-02 10:49:41
【问题描述】:

这是我的复杂类

namespace EnergaticWebApp.Models
{
    public class MyModel
    {
        public string MyString { get; set; }
        public int MyInt { get; set; }
        public bool MyBoolean { get; set; }
        public decimal MyDecimal { get; set; }
        public DateTime MyDateTime1 { get; set; }
        public DateTime MyDateTime2 { get; set; }
        public List<string> MyStringList { get; set; }
        public Dictionary<string, Person> MyDictionary { get; set; }
        public MyModel MyAnotherModel { get; set; }
    }

    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

这是我想要显示复杂类数据的操作方法

public IActionResult Privacy()
{
        var options = new JsonSerializerOptions
        {
            PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
            WriteIndented = true
        };

        var folderDetails = Path.Combine(Directory.GetCurrentDirectory(), $"wwwroot\ 
                            {"json\\my-model.json"}");
        var jsonString = System.IO.File.ReadAllText(folderDetails);

        //  var jsonString = File.ReadAllText("my-model.json");
        var jsonModel = JsonSerializer.Deserialize<MyModel>(jsonString, options);
        var modelJson = JsonSerializer.Serialize(jsonModel, options); //not in use

        return View(jsonModel);
    }
}

一切正常,除了当我在视图中返回我的 jsonModel 时出现错误:

InvalidOperationException:传递到 ViewDataDictionary 的模型项的类型为“EnergaticWebApp.Models.MyModel”,但此 ViewDataDictionary 实例需要“System.Collections.Generic.List`1[EnergaticWebApp.Models.MyModel] 类型的模型项'

关于如何做到这一点的任何建议?

【问题讨论】:

  • 请也发表您的看法
  • 能否添加my-model.json的内容
  • 处理您的问题的方法太多了。你可以查看我的详细回答。希望它能帮到你很多。
  • 嗨@Asad Malikz,我的回答是否帮助您解决了您的问题?如果是这样,你能接受作为答案吗?如果没有,你能跟进让我知道吗?参考:How to accept as answer。谢谢。

标签: asp.net-core-mvc


【解决方案1】:

错误很明显——你将MyModel 传递到视图中(jsonModel);但是视图需要List&lt;MyModel&gt;。他们必须匹配!

【讨论】:

  • 当我转换成列表时: var jsonModel = JsonSerializer.Deserialize>(jsonString, options);它现在给我这个错误:无法将 JSON 值转换为 System.Collections.Generic.List`1[EnergaticWebApp.Models.MyModel]。路径:$ |行号:0 | BytePositionInLine: 1
【解决方案2】:

尝试在隐私视图中更改您的模型

@model EnergaticWebApp.Models.MyModel

【讨论】:

    【解决方案3】:

    InvalidOperationException:传入的模型项 ViewDataDictionary 的类型为“EnergaticWebApp.Models.MyModel”,但 此 ViewDataDictionary 实例需要类型为模型项 'System.Collections.Generic.List`1[EnergaticWebApp.Models.MyModel]'

    此错误消息意味着您的视图需要 List&lt;MyModel&gt; 类型,但您在后端传递了 MyModel 类型。

    第一种方式是更改视图所需的模型,但这种方式可能会导致您需要对 html 代码进行大量更改:

    @model EnergaticWebApp.Models.MyModel
    

    第二种方法是将您的返回模型更改为List&lt;MyModel&gt;。您可以为List&lt;MyModel&gt; 创建一个实例并将您的jsonModel 添加到其中:

    var jsonModel = JsonSerializer.Deserialize<MyModel>(jsonString, options);
    var data = new List<MyModel>();   //add this..
    data.Add(jsonModel);
    return View(data);
    

    当我转换成列表时: var jsonModel = JsonSerializer.Deserialize(jsonString, options);它现在给我这个错误:无法将 JSON 值转换为 System.Collections.Generic.List`1[EnergaticWebApp.Models.MyModel]。路径:$ |行号:0 | BytePositionInLine: 1

    只有像下面这样的 json 可以反序列化为 List&lt;MyModel&gt;。如果允许更改 json,可以使用第三种方式(var jsonModel = JsonSerializer.Deserialize&lt;List&lt;MyModel&gt;&gt;(jsonString, options);)

    [
      {
        "MyString": "sad",
        "MyInt": 1 
        //more properties...
      }
    ]
    

    【讨论】:

      猜你喜欢
      • 2020-09-09
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 2020-11-29
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多