从基本模型访问DB

时间:2014-07-11 06:22:35

标签: c# asp.net-mvc generic-programming

我有一个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()方法。

1 个答案:

答案 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());
}