0

朋友们好!

我有 2 个模型类说PagePageHistory。两者都包含相同的属性。在这里,每当我编辑Page对象时,我都需要使用相同的属性值更新PageHistory对象。

我试过这样的事情:

[HttpPost]
        [ValidateInput(false)]
        public ActionResult Edit(Page page, FormCollection frm)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    page.IsPublished = !string.IsNullOrEmpty(frm["BtnPublish"]);
                    _db.Entry(page).State = EntityState.Modified;
                    _db.SaveChanges();

                    //Add updated page in hitory, if something is modified
                    PageHistory ph=new PageHistory();
                    ph.ID=page.ID
                    // likewise all attributes.....
                    // after all values are assigned, save a History object
                    ph.SaveChanges();

                    return RedirectToAction("Subpages", new { id = page.ParentId });
                }
            }
            catch (DataException)
            {
                //Log the error (add a variable name after DataException)
                ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists see your system administrator (http://support.mysite.com).");
            }
            return View(page);
        }

它正在工作,但这并没有那么优化,是否有任何替代方法可用于复制对象?还有一个问题是,是否可以从 Page 类继承 PageHistory因为两者都包含相同的属性?哪一个是最好的方法?

4

1 回答 1

2
  1. 我建议您使用相同的模型进行相同的数据表示。

  2. 我建议您创建继承类 PageHistory。它将允许您将 Page 转换为 PageHistory,例如:

    (PageHistory) page;
    
  3. 我建议您将 PageHistory 道具复制封装在界面后面,例如:

    public interface IPageHistoryBuilder
    {
        PageHistory Build(Page page);
    }
    
    public class PageHistoryBuilder : IPageHistoryBuilder
    {
        public PageHistory Build(Page page)
        {
            return new PageHistory
            {
                // copy ALL the props here
            }
        }
    }
    

您的代码将如下所示:

if (ModelState.IsValid)
{
    page.IsPublished = !string.IsNullOrEmpty(frm["BtnPublish"]);
    _db.Entry(page).State = EntityState.Modified;
    _db.SaveChanges();

    var ph = pageHistoryBuilder.Build(page);
    ph.SaveChanges();
// and so long
}

并且不要忘记在控制器构造函数中声明构建器:

public class YourController : Controller
{
     private readonly IPageHistoryBuilder pageHistoryBuilder;
     public YourController(IPageHistoryBuilder pageHistoryBuilder)
     {
         this.pageHistoryBuilder = pageHistoryBuilder;
     }
}
于 2012-11-06T07:09:48.047 回答