【问题标题】:How to display list object to a view in ASP.Net MVC?如何在 ASP.Net MVC 中将列表对象显示到视图中?
【发布时间】:2019-05-07 07:20:01
【问题描述】:

我很难将列表对象模型中的值显示到视图中。

我尝试使用此代码显示它

@model IEnumerable<MVC.Models.RootObject>

@foreach (var item in @Model)
{
    <li>@item.records</li>
} 

但是显示错误

传入字典的模型项的类型为“MVC.Models.RootObject”,但此字典需要类型为“System.Collections.Generic.IEnumerable`1[MVC.Models.RootObject]”的模型项。

这是我用来将数据从模型传递到视图的控制器

           var transno = "ST-100420190001";

            var client = new HttpClient();
            var httpRequestMessage = new HttpRequestMessage
            {
                Method = HttpMethod.Get,
                RequestUri = new Uri("https://myurl.com/" + transno),
                Headers = {
                { HttpRequestHeader.Accept.ToString(), "application/json" },
                { HttpRequestHeader.ContentType.ToString(), "application/json"},
                { "client-id", "client_id"},
                { "client-secret","client_secret"},
                { "partner-id","partner_id"},
                { "X-Version", "1" }
            }
            };

            var response = client.SendAsync(httpRequestMessage).Result;
            RootObject obj = JsonConvert.DeserializeObject<RootObject>(await 
            response.Content.ReadAsStringAsync());

            return View(obj);

RootObject 模型如下所示

public class RootObject
    {
        public List<Record> records { get; set; }
        public int totalRecords { get; set; }
    }

那么Record模型是这样的

 public class Record
    {
        public string transferId { get; set; }
        public string type { get; set; }
        public DateTime createdAt { get; set; }
        public string dateUpdated { get; set; }
        public string state { get; set; }
        public string senderTransferId { get; set; }
    }

【问题讨论】:

  • 您的视图文件中的@model 行是什么?该错误表明它是IEnumerable&lt;RootObject&gt;,但您传递的是一个RootObject

标签: c# asp.net-mvc view model


【解决方案1】:

好的,我们来看看错误信息

您的视图期望 IEnumerableRootObject,但您只是传入了一个 RootObject。

The model item passed into the dictionary is of type 'MVC.Models.RootObject', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[MVC.Models.RootObject]'.

我不确定您的 API 正在回复什么,但您可能需要将 DeserializeObject 发送到 IEnumerableRootObject 而不是单个对象。您是否尝试过调试这些行?

var response = client.SendAsync(httpRequestMessage).Result;
RootObject obj = JsonConvert.DeserializeObject<RootObject>(await response.Content.ReadAsStringAsync());

return View(obj);

如果不是这种情况,并且您希望在以后进行多次 API 调用以构建列表

这样的事情应该可以工作,但我建议您遵循上述内容,因为从您发布的剃须刀来看,这似乎更像您正在寻找的东西。

var response = client.SendAsync(httpRequestMessage).Result;
RootObject obj = JsonConvert.DeserializeObject<RootObject>(await 
response.Content.ReadAsStringAsync());

IEnumerable<RootObject> list = new List<RootObject>(){ obj };

return View(list);

【讨论】:

  • 我的 api 返回的是一个“记录”对象列表,就像我的“记录”模型中显示的那样。您的第二个建议对我有用,但是可以进行多次 api 调用来构建列表吗?它不会减慢页面速度吗?
  • @ikey 会减慢页面速度。您需要调用返回 record 对象列表的端点,然后是 DeserializeObjectIEnumerable&lt;RootObject&gt;
【解决方案2】:

根据我的评论,您希望更改 @model 行并可能按如下方式充实循环。

@model MVC.Models.RootObject

@foreach (var item in @Model.records)
{
    <li>@item.transferId</li>
    <li>@item.type</li>
    // etc
} 

【讨论】:

  • 我在使用您的代码建议后遇到了这个错误。 “IEnumerable”不包含“记录”的定义,并且找不到接受“IEnumerable”类型的第一个参数的扩展方法“记录”
  • @ikey 那是因为你没有给records任何值,所以它是空的
  • 但是在我调试程序之后,我看到一个值被传递给了records。也许这段代码是问题所在? IEnumerable&lt;MVC.Models.RootObject&gt;
  • @ikey 这听起来不像您正确更改了foreach。您是否对其进行了编辑以循环通过 records 而不是模型? / 将视图模型从列表更改为单个模型
  • 我在答案中添加了@model 行,它应该只是RootObject 而不是它们的集合。
猜你喜欢
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多