我有一个班级
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public string Designation { get; set; }
public Guid UserId { get; set; }
}
我创建了不同的用户,我可以通过不同的用户输入数据。在我的控制器上,我想显示仅由记录用户输入的数据..。这是我的控制器代码
// GET: Employees
[Authorize]
public ActionResult Index()
{
MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true);
var empList = from emp in db.Employees
where emp.UserId == (Guid)currentUser.ProviderUserKey
select emp;
return View(empList);
}
我的@foreach行视图中出现错误
这是我的观点
@model IEnumerable<LoginTestApp.Models.Employee>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Designation)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
类型&#39; System.InvalidCastException&#39;的例外情况发生在EntityFramework.SqlServer.dll中但未在用户代码中处理
其他信息:指定的演员表无效。
任何帮助
答案 0 :(得分:0)
正如Muecke在评论中建议的那样,您目前正在返回IQueriable而不是IEnumerable。所以添加ToList()应该可以解决这个问题。您可能还想添加
return View(empList.ToList())
此外,您可能希望通过在查询中添加订单来返回已排序的结果,或者在此处添加:
return View(empList.SortBy(o=>o.Name).ToList())
另请注意,让UserId成为您最近编辑记录的人的指标,尤其是在包含人物的表格上,这令您感到困惑(正如您在评论中看到的那样)!
我发现真正有用的是将我的模型基于一个继承的类,其中包含我想在数据库级别上跟踪的所有内容。例如,您创建了一个名为DataObject的类,如下所示:
public int Id { get; set; }
public Guid CreatedByGuid { get; set; }
public Guid EditedByGuid { get; set; }
public DateTime CreateDateTime { get; set; }
public DateTime EditDateTime { get; set; }
然后,您可以将这些继承到您的Employee类:
public class Employee: DataObject
{
等。特别是与Code First设计相结合,从您的对象生成数据库,这非常强大和干净。如果要跟踪其他任何内容,只需添加或更改DataObject类,所有类和表格都将更新。