我有一个basemodel如下所示,我使用这个模型来获取/设置每个模型的创建和修改日期。
public class BaseModel
{
[ForeignKey("CrUser")]
public ApplicationUser UserCr { get; set; }
public string CrUser { get; set; }
public DateTime? MdDate { get; set; }
[ForeignKey("MdUser")]
public ApplicationUser UserMd { get; set; }
public void LogBasic()
{
if (this.CrDate == null)
{
this.CrDate = System.DateTime.Now;
this.CrUser = HttpContext.Current.User.Identity.GetUserId();
}
else
{
this.MdDate = System.DateTime.Now;
this.MdUser = HttpContext.Current.User.Identity.GetUserId();
}
}
}
创建新条目时没有问题,但在更新模型时,我无法设置MdUser。我知道原因是,CrUser和CrDate是空的,你可以看到下面的方法,它们没有绑定。
这是我的编辑方法
public ActionResult Edit([Bind(Include = "Id,Name,FullName,Address,TaxNumber,TaxOffice,Phone1,Phone2,Email,CompanyType")] CrmCompany crmcompany)
{
if (ModelState.IsValid)
{
crmcompany.LogBasic();
db.Entry(crmcompany).State = EntityState.Modified;
db.SaveChanges();
}
}
用我的方式解决问题,我需要传递CrDate和CrUser,或者我需要从数据库获取每个编辑方法。
如何在LogBasic()方法中解决此问题。如果我可以访问DB并在LogBasic()方法中获取Crdate和Cruser,我可以轻松解决问题但是,任何模型都可以调用LogBasic()方法。
答案 0 :(得分:0)
无论如何,您将不得不将CrDate和CrUser用于模型创建或LogBasic函数。如果您在更新时没有,那么它们将被清空,因为模型中没有设置任何值。我建议将它们存储为隐藏字段并正常绑定它们。这样,您就不必两次前往数据库进行更新。
编辑: 为了使这更容易,您可以将此方法添加到BaseModel类。它会输出要绑定的隐藏字段。我做了一些假设(比如UserIds都是正整数)。
public MvcHtmlString BaseModelHiddenFields()
{
StringBuilder outputString = new StringBuilder();
if(CrDate != null && CrDate.HasValue)
{
sb.AppendFormat("<input type=\"hidden\" name\="CrDate\" value=\"{0}\">", CrDate.Value);
}
if(CrUser > 0)
{
sb.AppendFormat("<input type=\"hidden\" name\="CrUser\" value=\"{0}\">", CrUser);
}
if(MdDate != null && MdDate.HasValue)
{
sb.AppendFormat("<input type=\"hidden\" name\="MdDate\" value=\"{0}\">", MdDate.Value);
}
if(MdUser > 0)
{
sb.AppendFormat("<input type=\"hidden\" name\="MdUser\" value=\"{0}\">", MdUser);
}
return MvcHtmlString.Create(sb.ToString());
}