2016-04-01 26 views
0

我使用ASPNET MVC5和我只是按照本教程:http://www.c-sharpcorner.com/UploadFile/4d9083/creating-simple-grid-in-mvc-using-grid-mvc/它工作正常。 我现在想用2个表(用户&角色), 注意更新我的HomeController:我的DataContext包含2个表(用户&角色)MVC5 MVCGRID Linq倍数表

HomeController.cs

public ActionResult Details() 
     { 
      DataClassesUserDataContext db = new DataClassesUserDataContext(); 
      var SchemeList = from d in db.AspNetUsers 
          join i in db.AspNetUserRoles 
           on d.Id equals i.UserId 
          select new { AspNetUsers = d, AspNetUserRole = i }; 
      return View(SchemeList); 
     } 

我回到我的好结果

在我看来

现在:

我Details.cs html 问题在这里?我可以打电话给shanuMVCUserRoles.DB.AspNetUser & AspNetUserRoles ???

@model IEnumerable <shanuMVCUserRoles.DB.AspNetUser> 
// possible to add other models here ? @model IEnumerable <shanuMVCUserRoles.DB.AspNetUserRole > 


    > <div 
    > class="code-cut"> 
    >  @Html.Grid(Model).Columns(columns => { 
    >  columns.Add(c => c.UserName).Titled("UserName").Filterable(true); 
    >  columns.Add(c => c.Id).Titled("ID").Filterable(true); 
    >  columns.Add(c => c.PasswordHash).Titled("PasswordHash").Filterable(true); 
    >  columns.Add(c => c.Email).Titled("Email").Filterable(true); 
    >  columns.Add(c => c.AccessFailedCount).Titled("AccessFailedCount").Filterable(true); 
    >  columns.Add(c => c.PhoneNumber).Titled("PhoneNumber").Filterable(true); 
    >  columns.Add() 
    >  .Encoded(false) 
    >  .Sanitized(false) 
    >  .SetWidth(30) 
    >  .RenderValueAs(o => Html.ActionLink("Edit", "Edit", new { id = o.Id })); }).WithPaging(10).Sortable(true) </div> 

我有以下错误: 传递到词典中的模型项的类型为 'System.Data.Linq.DataQuery 1[<>f__AnonymousType4 2 [shanuMVCUserRoles.DB.AspNetUser,shanuMVCUserRoles.DB.AspNetUserRole]]' ,但是这个字典需要一个'System.Collections.Generic.IEnumerable`1 [shanuMVCUserRoles.DB.AspNetUser]'类型的模型项。

回答

0

你可以通过将你的AspNetUserRoles集合放入ViewBag来解决这个问题。此链接显示在其他此解决方案: http://www.codeproject.com/Articles/687061/Multiple-Models-in-a-View-in-ASP-NET-MVC-MVC

我个人认为模型作为一种合同我的控制器和我观之的,所以我不喜欢把业务信息的模型之外。例如,可以存储字符串以将DateTime格式化为ViewBag。但是如果我想要一个Controller和一个View来管理用户和角色,我希望它对我和其他读代码的人来说很清楚,这些代码可能在今天,明天或十年内发生。

因此,在这种情况下,我将创建一个模型类:

namespace WebApplication1.Models 
{ 
    public class UsersAndRolesModel 
    { 
     public IList<shanuMVCUserRoles.DB.AspNetUser> Users { get; set; } 
     public IList<shanuMVCUserRoles.DB.AspNetRole> Roles { get; set; } 
    } 
} 

我将创建它,并在我的控制器来填充它。 然后在我看来,我就会宣布:

@model WebApplication1.Models.UsersAndRolesModel 

,最后我的网格:

@Html.Grid(Model.Users).Columns(columns => { // and so on... 

@Html.Grid(Model.Roles).Columns(columns => { // and so on... 

我希望这有助于。

编辑: 嗨大卫,这取决于你真正想做的事:你要显示两个表,一个为所有用户,一个面向所有角色视图? 在这种情况下,第一个实现可以(但不应)是:

public ActionResult Details() 
    { 
     UsersAndRolesModel model = new UsersAndRolesModel(); 
     DataClassesUserDataContext db = new DataClassesUserDataContext(); 
     model.Users = db.AspNetUsers.ToList(); 
     model.Roles = db.AspNetUserRoles.ToList(); 
     return View(model); 
    } 

我写应该是因为DataClassesUserDataContext必须在使用后丢弃。所以你真正应该做的是:

public class HomeController : Controller 
{ 
    private DataClassesUserDataContext db = new DataClassesUserDataContext(); 

    public ActionResult Details() 
    { 
     UsersAndRolesModel model = new UsersAndRolesModel(); 
     model.Users = db.AspNetUsers.ToList(); 
     model.Roles = db.AspNetUserRoles.ToList(); 
     return View(model); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      db.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

} 
0

我编辑了我以前的答案与关于如何可以实施控制器的一些信息。 的NullReferenceException异常发生,因为返回

return View(); 

提供零模型视图,因此Model.Users和Model.Roles导致您查看的NullReferenceException。 请注意,我返回

return View(model); 

在我的HomeController。

让我补充一点,我避免在我的控制器中使用DbContexts。 我更喜欢实现Repository模式。 你可以在这里找到一个很好的例子: http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application 这是一个更好的方法,因为它允许你创建一个Test项目并通过提供模拟库实现来测试你的控制器。

+0

是的,好的,谢谢! – david