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

时间:2015-05-22 11:23:49

标签: c# asp.net-mvc asp.net-mvc-4

以下是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])行中,有一个例外:

  

&#39;&System.Web.Mvc.HtmlHelper GT;&#39;   没有适用的方法名称&#39;部分&#39;但似乎有一个   该名称的扩展方法。扩展方法不能动态   出动。考虑转换动态参数或调用   没有扩展方法语法的扩展方法。

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

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

3 个答案:

答案 0 :(得分:6)

使用时

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

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

一个解决方案:

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

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

其他解决方案:不要使用&#34; for&#34;循环,但是&#34; foreach&#34;:

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

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

答案 1 :(得分:2)

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

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

为Employee模型定义编辑器或显示模板(您应该将它放在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>
}

答案 2 :(得分:1)

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

private static final int W = 640;
private static final int H = 480;
…
Display d = new Display(vis) {

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(W, H);
    }
};
d.pan(W / 2, H / 2);