MVC如何在视图中使用存储在ViewBag中的IEnumerable变量

本文关键字:ViewBag 存储 中的 IEnumerable 变量 视图 MVC | 更新日期: 2023-09-27 17:50:20

以下是View中出现错误的简化代码:

型号:

    public class Employee
    {
        public string EmployeeID{ get; set; }
        public string Name { get; set; }
        ...
    }

控制器:

    public ActionResult Index()
    {
        var model = selectAllEmployees();
        ViewBag.ITDept = model.Where(a => a.departmentID == 4);
        ViewBag.Officer = model.Where(a => a.departmentID == 5);
        return View(model);
    }

视图:

@model IList<EnrolSys.Models.Employee>
@{
    Layout = null;
}
@using (Html.BeginForm("Save", "EmployMaster"))
{
    for (int i = 0; i < ViewBag.ITDept.Count(); i++)
    {
        //Here's the error occurs
        @Html.Partial("EmployeeDisplayControl", ViewBag.ITDept[i])
    }
    <br />
}

@Html.Partial("EmployeeDisplayControl", ViewBag.ITDept[i])行中,有一个异常:

'System.Web.Mvc.HtmlHelper>'没有名为"Partial"的适用方法,但似乎具有扩展方法。扩展方法不能是动态的派遣。请考虑强制转换动态参数或调用没有扩展方法语法的扩展方法。

我想这是在说我不能在动态表达式中使用扩展方法,有什么解决办法吗??

我为这个错误犯了一个错误:https://dotnetfiddle.net/ekDH06

MVC如何在视图中使用存储在ViewBag中的IEnumerable变量

使用时

ViewBag.ITDept = model.Where(a => a.departmentID == 4);

Viewbag.ITDept中得到IEnumerable,而不是IList。这意味着您不能使用索引器(如ViewBag.ITDept[i](,因为IEnumerable不支持随机访问。

一种解决方案:

ViewBag.ITDept = model.Where(a => a.departmentID == 4).ToList();

现在它是一个列表,所以您可以使用索引器。

其他解决方案:不要使用"for"循环,而是使用"foreach":

foreach (var employee in ViewBag.ITDept)
{
    @Html.Partial("EmployeeDisplayControl", employee )
}

也许您仍然需要将ViewBag.ITDept转换为IEnumerable<Employee>

您可以为此使用编辑器/显示模板:

public class YourViewModel
{
   public IList<Employee> ITDept {get; set;}
   public IList<Employee> Officers {get; set;}
   //other properties here
}

为您的员工模型定义一个编辑器或显示模板(您应该相应地将其放在Views/Shared/EditorTemplates或Views/Shared/DisplayTemplates下(:

模板可能看起来像这样(当然它是一个简化版本(:

@model EnrolSys.Models.Employee
<div>
   @Html.EditorFor(m=>m.Name)
</div>

现在,Index操作的视图将接收YourViewModel作为模型你可以简单地使用:

@model YourViewModel 

@using (Html.BeginForm("Save", "EmployMaster"))
{
    <div>
        @Html.EditorFor(m=>m.ITDept)
    </div>
}

您需要为动态表达式提供一个静态类型。试试这个:

@Html.Partial("EmployeeDisplayControl", (object)ViewBag.ITDept[i])