3

私がここに持っているものが良い習慣であるかどうか疑問に思っています。MVC およびビュー モデルで Entity Framework Code First を使用する。以下に、リスト、作成、編集、および削除のコードがあります。モデル名 Page と 2 つの ViewModels 名 ContentViewModel および ContentListViewModel。

 private readonly IUserService _userService;
    //private readonly MembershipProvider _members;

    public ContentController()
    {
        // _members = Membership.Provider;
        _userService = new AspNetMembershipProviderWrapper();
    }

    //
    // GET: /Profile/Content/

    public ActionResult Index()
    {
        using (var db = new BlogContext())
        {
            IEnumerable<Page> pages;
            pages = db.ArticlePages.ToList();
            List<ContentListViewModel> model = new List<ContentListViewModel>();
            foreach (Page pg in pages)
            {
                MembershipUser user = _userService.Get(pg.authorId);
                model.Add(new ContentListViewModel()
                {
                    PageID = pg.pageID,
                    UserName = user.UserName,
                    UserID = (Guid)user.ProviderUserKey,
                    IsFrontPage = pg.frontpage,
                    isPublished = pg.published,
                    PageTitle = pg.titleHeading,
                    PageUrlName = pg.idName,
                    PublishedDate = pg.datentime
                });
            }

            return View(model);
        }
    }

    //
    // GET: /Profile/Content/Create

    public ActionResult Create()
    {
        return View();
    }

    //
    // POST: /Profile/Content/Create

    [HttpPost]
    public ActionResult Create(ContentViewModel page)
    {
        if (ModelState.IsValid)
        {
            using (var db = new BlogContext())
            {
                db.ArticlePages.Add(new Page()
                {
                    authorId = (Guid)Membership.GetUser().ProviderUserKey,
                    datentime = DateTime.Now,
                    frontpage = page.FrontPage,
                    published = page.Published,
                    titleHeading = page.TitleHeading,
                    pageContent = page.Content,
                    idName = page.IdName
                });
                db.SaveChanges();
                return RedirectToAction("Index").Success("Page added Successfully.");
            }
        }

        return View(page);
    }


    //
    // GET: /Profile/Content/Edit/5

    public ActionResult Edit(int id = 0)
    {
        if (id == 0)
        {
            return RedirectToAction("Index").Error("Page Not found.");
        }
        Page pg = new Page();
        using (var db = new BlogContext())
        {
            pg = (from m in db.ArticlePages where m.pageID == id select m).SingleOrDefault();
        }
        if (pg == null)
        {
            return RedirectToAction("Index").Error("Page Not found..");
        }
        return View(new ContentViewModel()
        {
            id = pg.pageID,
            Content = pg.pageContent,
            FrontPage = pg.frontpage,
            Published = pg.published,
            TitleHeading = pg.titleHeading,
            IdName = pg.idName
        });
    }


    // POST: /Profile/Content/Edit/5

    [HttpPost]
    public ActionResult Edit(ContentViewModel page)
    {
        if (ModelState.IsValid)
        {
            using (var db = new BlogContext())
            {
                var oPage = db.ArticlePages.Single(p => p.pageID == page.id);
                oPage.frontpage = page.FrontPage;
                oPage.idName = page.IdName;
                oPage.pageContent = page.Content;
                oPage.published = page.Published;
                oPage.titleHeading = page.TitleHeading;
                db.SaveChanges();
                return RedirectToAction("Index").Success("Page updated");
            }
        }
        return View(page);
    }

    //
    // POST: /Profile/Content/Delete/5

    [HttpPost]
    public ActionResult Delete(int id)
    {
        using (var db = new BlogContext())
        {
            Page page = db.ArticlePages.Find(id);
            db.ArticlePages.Remove(page);
            db.SaveChanges();
            return RedirectToAction("Index").Success("Page deleted");
        }
    }

これを行うためのより良い方法があることを知りたいですか?

4

1 に答える 1

1

この方法は、エンティティをビューに直接渡すよりも確かに優れていますが、いくつかの改善点を提案します。

まず、新しいビジネス レイヤーを作成し、次にファサード クラスを作成してデータを取得します。次に、すべてのデータベース アクセスをこのレイヤーに移動します。したがって、上記のようにデータベースに直接アクセスするのではなく、サービス レイヤーを呼び出すことになります。

次に、AutoMapper などを使用してデータ エンティティとビュー モデルをマッピングすることを検討する必要があります。

于 2012-11-08T18:55:05.833 に答える