好日子的朋友们!
我有2个模型类,分别是 Page 和 PageHistory 。都包含相同的属性。每当我编辑 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);
}
它正在工作,但这不是那么优化,有没有可用于复制对象的替代方案?还有一个问题是,是否可以从页面类中继承 PageHistory 类,因为它们都包含相同的属性?哪一个是最好的方法?
答案 0 :(得分:2)
我建议您使用相同的模型进行相同的数据显示。
我建议你创建继承类PageHistory。它允许您将Page转换为PageHistory,如:
(PageHistory) page;
我建议你将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;
}
}