0

私は ASPNET MVC5 を使用しており、このチュートリアルに従っています: http://www.c-sharpcorner.com/UploadFile/4d9083/creating-simple-grid-in-mvc-using-grid-mvc/で、正常に動作します。HomeController を 2 つのテーブル (Users & Roles) で更新したいのですが、注: My Datacontext には 2 つのテーブル (Users & Roles) が含まれています。

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

私は良い結果を返します

今私のビューで:

My Details.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.DataQuery 1[<>f__AnonymousType42[shanuMVCUserRoles.DB.AspNetUser,shanuMVCUserRoles.DB.AspNetUserRole]]' ですが、このディクショナリにはタイプのモデル アイテムが必要です'System.Collections.Generic.IEnumerable`1[shanuMVCUserRoles.DB.AspNetUser]'.

4

2 に答える 2

0

AspNetUserRoles コレクションを ViewBag に入れることで、この問題を回避できます。このリンクは、とりわけこのソリューションを示しています: http://www.codeproject.com/Articles/687061/Multiple-Models-in-a-View-in-ASP-NET-MVC-MVC

個人的には、Model は Controller と View の間の一種の契約であると考えているため、ビジネス情報を Model の外に置くのは好きではありません。たとえば、DateTimes をフォーマットするための文字列を ViewBag に保存しても問題ありません。しかし、コントローラーとビューでユーザーとロールを管理したい場合は、私とコードを読んでいる他の人にとって、それが今日、明日、または 10 年後に発生する可能性があることを明確にしたいと考えています。

したがって、この場合、Model クラスを作成します。

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 つのテーブルを表示するビューが必要ですか? この場合、最初の実装は次のようにすることができます (ただし、そうすべきではありません)。

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

}
于 2016-04-01T11:48:47.247 に答える
0

コントローラーの実装方法に関する情報を使用して、以前の回答を編集しました。NullReferenceException が発生するのは、

return View();

ビューに null モデルを提供するため、Model.Users と Model.Roles はビューで 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 テスト プロジェクトを作成し、モック リポジトリの実装を提供してコントローラーをテストできるため、より良いアプローチです。

于 2016-04-01T21:32:27.567 に答える