MVC在控制器中插入/更新

时间:2011-02-18 10:34:38

标签: asp.net-mvc asp.net-mvc-3 entity-framework-4

我的控制器中有以下内容(插入/或/更新新闻实体)。我正在使用EF POCO

       public class NewsViewModel
       {
           /// <summary>
           /// Initializes a new instance of the <see cref="NewsViewModel"/> class. 
           /// </summary>
           public NewsViewModel()
           {
               this.News = new News();
               this.Categories = new List<int>();
           }

           /// <summary>
           /// Gets or sets news.
           /// </summary>
           public News News { get; set; }

           /// <summary>
           /// Gets or sets categories.
           /// </summary>
           public IEnumerable<SelectListItem> SelectCategories { get; set; }

           /// <summary>
           /// Gets or sets GroupIn.
           /// </summary>
           public IEnumerable<int> Categories { get; set; }
    }


    [HttpPost]
    public ActionResult Edit(NewsViewModel row)
    {
        if (!ModelState.IsValid)
        {
            return View(row);
        }

        // Insert record
        if (row.News.NewsId == 0)
        {
            foreach (var item in row.Categories)
            {
                row.News.NewsCategory.Add(this.NewsCategoryRepository.GetRow(item));
            }

            this.NewsRepository.Insert(row.News);
        }
        else
        {
            // Update
            var updateRow = this.NewsRepository.GetRow(row.News.NewsId);
            updateRow.Title = row.News.Title;
            updateRow.ShortDescription = row.News.ShortDescription;
            updateRow.IsActive = row.News.IsActive;
            updateRow.PostDate = row.News.PostDate;
            updateRow.ArchiveDate = row.News.ArchiveDate;
            updateRow.LongDescription = row.News.LongDescription;
            updateRow.NewsCategory.Clear();
            foreach (var item in row.Categories)
            {
                updateRow.NewsCategory.Add(this.NewsCategoryRepository.GetRow(item));
            }


            this.NewsRepository.Update(updateRow);
        }

        this.NewsRepository.Context.SaveChanges();
        return this.RedirectToAction("Index");
    }
  1. 这是执行更新的最佳方式吗?那就是清除所有类别然后重新插入和更新?
  2. 更新是否比提取updateRow,更新值并更新更清晰?

1 个答案:

答案 0 :(得分:4)

首先。 Controller的职责不是执行以数据库为中心的任务,所以:

  • 让您的Repository类进行任何CRUD操作

然后只将您的对象从Controller传递到Repository,例如,它可以查看您的Repository和Controller用法:

public class NewsRepository : IRepository
{
    public void SaveOrUpdate(NewsViewModel news) 
    { 
        //if isNew then Save else Update
    }
    //public void Delete(NewsViewModel newsToDel){}
    //public NewsViewModel GetById(int newsId){}
}



public class NewsController : Controller
{
    private IRepository _newsRepository;
    public NewsController(IRepository newsRepository)
    {
        //passed from IoC container like StructureMap or instantiate it by your own here.
        _newsRepository = newsRepository;
    }

    [HttpPost]
    public ActionResult Edit(NewsViewModel row)
    {
        _newsRepository.SaveOrUpdate(rowEntity);
    }

}