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
当你使用
ViewBag.ITDept = model.Where(a => a.departmentID == 4);
Run Code Online (Sandbox Code Playgroud)
你得到IEnumerable的Viewbag.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>.
您可以为此使用编辑器/显示模板:
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)
| 归档时间: |
|
| 查看次数: |
4138 次 |
| 最近记录: |