MVC如何在View中使用存储在ViewBag中的IEnumerable变量?

Use*_*384 4 c# asp.net-mvc asp.net-mvc-4

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

模型:

    public class Employee
    {
        public string EmployeeID{ get; set; }
        public string Name { get; set; }
        ...
    }
Run Code Online (Sandbox Code Playgroud)

控制器:

    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);
    }
Run Code Online (Sandbox Code Playgroud)

视图:

@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 />
}
Run Code Online (Sandbox Code Playgroud)

在该行中@Html.Partial("EmployeeDisplayControl", ViewBag.ITDept[i]),有一个例外:

'System.Web.Mvc.HtmlHelper>'没有名为'Partial'的适用方法,但似乎有一个名称的扩展方法.无法动态分派扩展方法.考虑转换动态参数或调用扩展方法而不使用扩展方法语法.

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

我为这个错误做了一个小提琴:https: //dotnetfiddle.net/ekDH06

Han*_*ing 6

当你使用

ViewBag.ITDept = model.Where(a => a.departmentID == 4);
Run Code Online (Sandbox Code Playgroud)

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

一个解决方案

ViewBag.ITDept = model.Where(a => a.departmentID == 4).ToList();
Run Code Online (Sandbox Code Playgroud)

现在它一个List,因此您可以使用索引器.

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

foreach (var employee in ViewBag.ITDept)
{
    @Html.Partial("EmployeeDisplayControl", employee )
}
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*rt. 2

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

public class YourViewModel
{
   public IList<Employee> ITDept {get; set;}
   public IList<Employee> Officers {get; set;}
   //other properties here
}
Run Code Online (Sandbox Code Playgroud)

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

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

@model EnrolSys.Models.Employee

<div>
   @Html.EditorFor(m=>m.Name)
</div>
Run Code Online (Sandbox Code Playgroud)

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

@model YourViewModel 


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