2016-04-01 27 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