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

Posted

技术标签:

【中文标题】如何在 ASP.Net MVC 中将列表对象显示到视图中?【英文标题】:How to display list object to a view in 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 【参考方案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 而不是它们的集合。

以上是关于如何在 ASP.Net MVC 中将列表对象显示到视图中?的主要内容,如果未能解决你的问题,请参考以下文章

您可以在asp.net mvc中将复杂对象从表单发布到控制器吗

在 MVC ASP.Net 中将插件添加到部分视图选择列表

无法在 asp.net mvc 4 中将 JSON 对象映射到 JqGrid

如何在 ASP.NET MVC 视图中显示 2 个列表

是否可以将多个模型对象发送到 ASP.NET MVC 视图?

在 ASP.net MVC 4 中将类对象从一个控制器动作传递到不同的控制器动作