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

個人的に

、私は私のコントローラと私のビュー間契約の一種としてモデルを考えるので、私はモデルの外にビジネス情報を置くことが好きではありません。たとえば、DateButtonをViewBagにフォーマットするための文字列を格納しても問題ありません。しかし、コントローラとビューでユーザーとロールを管理したい場合は、私と他の誰かがコードを読んでいることを明示してください。これは今日、明日、または10年後に起こります。

したがって、この場合には、私はモデルクラスを作成します。

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... 

私はこのことができます願っています。

編集: こんにちはデイヴィッド、それはあなたが実際に何をしたいかによって異なります。次の2つのテーブル、すべてのユーザー用とすべての役割のための1つを示す表示をしたいですか?この場合 は、最初の実装は、(しかしはないはずです)のようになります。

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

コントローラをどのように実装できるかについての以前の回答を編集しました。 Model.UsersとModel.RolesはあなたのビューでとNullReferenceExceptionを引き起こすので、

return View(); 

ビューにヌルモデルを提供して返すので とNullReferenceExceptionが発生します。 返信していますのでご注意ください

return View(model); 

私のHomeControllerに入れてください。

コントローラにDbContextを使用しないでください。 私はリポジトリパターンの実装を好む。 良い例をここに見つけることができます: 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 これは、テストプロジェクトを作成し、モックリポジトリの実装を提供することによってコントローラをテストすることができるので、より良いアプローチです。

+0

はい、ありがとう! – david