2012-11-08 16 views
3

我想知道我在這裏有什麼是好的做法。 MVC和視圖模型首先使用實體​​框架代碼。 下面我有代碼列表,創建,編輯和刪除。模型名稱頁面和2 ViewModels名稱ContentViewModel和ContentListViewModel。帶虛擬機的Asp Net MVC是一種很好的做法嗎? (代碼示例)

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

我想知道有更好的方法來做到這一點?

回答

1

雖然這種方法肯定比直接將實體傳遞給視圖更好,但我會提出一些改進建議。

首先,我將創建一個新的業務層,然後創建一個Facade類來檢索您的數據。然後將所有數據庫訪問移動到此圖層。因此,您最終會調用服務層,而不是像上面所做的那樣直接訪問數據庫。其次,你應該考慮使用類似AutoMapper的東西來映射你的數據實體和你的視圖模型。

相關問題