如何在ASP.Net MVC中将列表对象显示到视图中?

3

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

我尝试使用以下代码来显示它

@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; }
    }

1
你的视图文件中的@model行是什么意思?错误提示是IEnumerable<RootObject>,但你却只传递了一个单独的RootObject - Jaybird
2个回答

2
根据我的评论,您想要更改@model行,并可能按如下方式扩展循环。建议修改代码如下: "根据我的评论,您想要更改@model行,并可能按如下方式扩展循环。"
@model MVC.Models.RootObject

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

在使用您的代码建议后,我遇到了这个错误。'IEnumerable<RootObject>'不包含'records'的定义,并且没有接受类型为'IEnumerable<RootObject>'的第一个参数的'records'扩展方法可以找到。 - ikey
@ikey 这是因为您没有给 records 赋任何值,因此它是 null。 - JamesS
但是当我调试程序后,发现一个值被传递给了 records。也许这段代码有问题?IEnumerable<MVC.Models.RootObject> - ikey
@ikey,这听起来好像你没有正确更改foreach。你是否已将其编辑为循环遍历records而不是模型?/ 将视图模型从列表更改为单个模型。 - JamesS
1
我在我的答案中添加了@model行,它应该只是RootObject而不是它们的集合。 - Jaybird

2

好的,让我们看一下错误信息

你的视图期望 IEnumerable 类型的 RootObject,但你只传入了一个单独的 RootObject

传递给字典的模型项的类型为'MVC.Models.RootObject',但该字典需要类型为'System.Collections.Generic.IEnumerable`1[MVC.Models.RootObject]'的模型项。

我不确定你的 API 返回了什么,但你可能需要将其 DeserializeObjectIEnumerable 类型的 RootObject,而不是单个对象。你尝试过调试这些代码吗?


注:Original Answer 翻译成“最初的回答”
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
@ikey,这会减慢页面速度。您需要调用一个返回record对象列表的端点,然后对IEnumerable<RootObject>进行DeserializeObject操作。 - Charlie.H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接