我有一个类
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) {
EntityFramework.SqlServer 中发生了类型为"System.InvalidCastException"的异常.dll但未在用户代码中处理
其他信息:指定的强制转换无效。
任何帮助
正如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 类,所有类和表都将更新。