如何在 Asp.NET MVC 视图名称空间中使用 List 或 IList 代替 IEnumerable?

Posted

技术标签:

【中文标题】如何在 Asp.NET MVC 视图名称空间中使用 List 或 IList 代替 IEnumerable?【英文标题】:How to use List or IList in place of IEnumerable in Asp.NET MVC Views name spaces? 【发布时间】:2022-01-10 20:46:33 【问题描述】:

我对 IList 的理解是它同时实现了 IEnumerable 和 ICollection。 而List是IList接口的具体实现。

所以我在视图命名空间中多次使用 IEnumerable 来迭代模型对象。 但是在命名空间中使用 IList 或 List 时,我得到了一个

“/”应用程序中的服务器错误

所以,

    为什么会这样?和 如果我想使用 List 或 IList 应该怎么做?

控制器中的动作:

private DummyProjectContext db = new DummyProjectContext();
  // GET: BankAccounts
    public ActionResult Index()
    
        List<BankAccount> ba = db.BankAccounts.ToList();
        return View(ba);
    

索引.cshtml

@model IList<DummyProject.Models.BankAccount>

@
    ViewBag.Title = "Index";


<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Name)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Amount)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) 
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Amount)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new  id=item.Id ) |
            @Html.ActionLink("Details", "Details", new  id=item.Id ) |
            @Html.ActionLink("Delete", "Delete", new  id=item.Id )
        </td>
    </tr>


</table>

好吧,我知道 IEnumerable 对于这个例子来说已经足够了,应该使用它。我想知道为什么使用 IList 或 List 会出现此错误?

【问题讨论】:

需要添加using语句System.Collections.Generic 嗯,我已经在我的控制器中使用了这个命名空间并在视图中进行了尝试,类似的东西:[@using System.Collections.Generic]。但这没有用。你能详细说明你在说什么 @Subhadeep:似乎与使用IList 无关。再检查一次:将IList 替换为IEnumerable 并再次运行。 @Jackdaw 我在问题中提到,使用 IEnumerable 我得到了想要的结果。我的问题是为什么我们不能在这里使用 List 或 IList ?或者应该使用 List 的场景是什么? @Subhadeep:请显示所有错误描述(应该是黄页)。 Server Error in '/' Application. 只是标题。 【参考方案1】:

你会在这里得到一个错误。使用 Inumerable 将解决此错误。

@Html.DisplayNameFor(model => model.Name)
...

@Html.DisplayNameFor(model => model.Amount)
...

【讨论】:

【参考方案2】:

我创建了 Asp.net 项目并添加了一个虚拟列表,但我没有收到该错误可能您的列表对象为空。

控制器:

var s=new List<string>();
s.add("test");
return view(s);

view:
@model IList<string>

<ul>
  @foreach(var item in Model)
  
   <li>item</li>
  
</ul>

更多疑难解答: 当您运行项目以查看完整错误时,请复制错误的所有堆栈跟踪。可能是其他原因造成的。

【讨论】:

【参考方案3】:

您的问题中的代码包含两个错误并且无法编译:

@Html.DisplayNameFor(model => model.Name)
...

@Html.DisplayNameFor(model => model.Amount)
...

您必须修复这些错误。

更新:

只是为了测试,尝试将上面的两行替换为:

@Html.DisplayNameFor(model =&gt; Model.FirstOrDefault().Name)

@Html.DisplayNameFor(model =&gt; Model.FirstOrDefault().Amount)

使用@model IList&lt;DummyProject.Models.BankAccount&gt;如果会有任何变化,请告诉我。

【讨论】:

是的,你是对的。使用 IEnumerable 作为命名空间,此代码完美运行。我的问题是在 namspace 中使用模型 IList 为什么这条线不包含这两条线的实现?牢记这一点:IList 实现了 IEnumerable 和 ICollection[来源:csharpcorner]

以上是关于如何在 Asp.NET MVC 视图名称空间中使用 List 或 IList 代替 IEnumerable?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET MVC 视图中将主键转换为实际名称/描述符字段

如何测试 Asp.Net MVC 视图是不是无例外地呈现?

Asp.net MVC 视图

如何在 ASP.NET MVC 3 中为填充的下拉列表创建视图模型

ASP.NET MVC 如何从嵌套对象的视图模型集合中动态创建表结构

ASP.NET MVC 部分视图:输入名称前缀