0

こんばんは!

PagePageHistoryという 2 つのモデル クラスがあります。両方に同じ属性が含まれています。ここでは、 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);
        }

動作していますが、これはあまり最適化されていません。オブジェクトをコピーするための代替手段はありますか? もう 1 つの質問は、両方に同じ属性が含まれているため、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 に答える