MVC 5 MVC GRID Linq 多表

Posted

技术标签:

【中文标题】MVC 5 MVC GRID Linq 多表【英文标题】:MVC5 MVCGRID Linq multiples tables 【发布时间】:2016-07-21 04:00:43 【问题描述】:

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

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);
        

我的结果很好

现在在我看来:

我的详细信息.cshtml 问题在这里吗?我可以打电话给 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.DataQuery1[&lt;&gt;f__AnonymousType42[shanuMVCUserRoles.DB.AspNetUser,shanuMVCUserRoles.DB.AspNetUserRole]]”,但此字典需要类型为“System.DataQuery”的模型项。 Collections.Generic.IEnumerable`1[shanuMVCUserRoles.DB.AspNetUser]'。

【问题讨论】:

【参考方案1】:

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

就我个人而言,我认为模型是我的控制器和视图之间的一种契约,因此我不喜欢将业务信息放在模型之外。例如,可以将字符串以格式化 DateTimes 存储到 ViewBag 中。但是,如果我想要一个控制器和一个视图来管理用户和角色,我希望它对我和其他阅读代码的人来说是清楚的,这可能在今天、明天或十年后发生。

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

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);
    


【讨论】:

【参考方案2】:

我已经编辑了我之前的答案,其中包含有关如何实现控制器的一些信息。 NullReferenceException 发生是因为返回

return View();

为视图提供空模型,因此 Model.Users 和 Model.Roles 会导致视图中的 NullReferenceException。 请注意我要回来了

return View(model);

在我的 HomeController 中。

让我补充一点,我避免在我的控制器中使用 DbContexts。 我更喜欢实现存储库模式。 你可以在这里找到一个很好的例子: 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 这是一种更好的方法,因为它允许您创建一个测试项目并通过提供模拟存储库实现来测试您的控制器。

【讨论】:

以上是关于MVC 5 MVC GRID Linq 多表的主要内容,如果未能解决你的问题,请参考以下文章

wen应用/路由控制/视图函数/单表多表操作

Linq中的group by多表多字段

Linq中的group by多表多字段,Sum求和

asp.net mvc3 linq 多表查询怎么把返回的集合在页面循环输出

linux12 -MYSQL数据库 -->04 数据表单表多表查询--02

DMLDQL与单表多表的增删改查(20190215下午)