以下是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
答案 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);