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
使用时
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])