如何使用ASP.net MVC,Entity Framework和Razor进行补丁更新模型

Phi*_*lla 2 asp.net-mvc razor entity-framework-5

我设法使用asp.net MVC创建基本的CRUD操作

但是我的领域有问题Status,CreatedOn而且CreatedBy.

我希望在创建操作期间填充这些字段,并且在编辑操作期间不会更新这些字段,但我不想对这些字段使用@HiddenFor,因为您可以编辑DOM并在POST请求之前仍然更新这些信息.

基本上我想要的是使用POST请求中发送的任何数据来修补我的模型.因此,我不必担心编辑操作中正在更改我不想修改的字段.

这是我的模型和动作的代码.

模型

[Table("Account")]
public class Account
{
    #region Properties

    [Key]
    public int AccountID { get; set; }

    [Required]
    [StringLength(50)]
    [DisplayName("Account Name")]
    public string Name { get; set; }

    [Required]
    [DisplayName("Time Offset")]
    [Range(-24,24)]
    public decimal TimeOffset { get; set; }

    [StringLength(20)]
    [DisplayName("Status")]
    public string Status { get; set; }

    public DateTime CreatedOn { get; set; }

    public int CreatedBy { get; set; }

    public DateTime? ModifiedOn { get; set; }

    public int ModifiedBy { get; set; }

    #endregion
}

public class DbAccount : DbContext
{
    public DbSet<Account> Accounts { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制器动作创建

[HttpPost]
    public ActionResult Create(Account account)
    {
        if (ModelState.IsValid)
        {
            account.Status = "ENABLED";
            account.CreatedOn = DateTime.Now;
            account.CreatedBy = 1;
            db.Accounts.Add(account);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(account);
    }
Run Code Online (Sandbox Code Playgroud)

编辑控制器操作

[HttpPost]
    public ActionResult Edit(Account account)
    {
        if (ModelState.IsValid)
        {
            account.ModifiedOn = DateTime.Now;
            account.ModifiedBy = 1;
            db.Entry(account).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(account);
    }
Run Code Online (Sandbox Code Playgroud)

我怎样才能修改模型没有明确影响某些特定属性CreatedOnCreatedBy,我想这些属性保留编辑操作过程中的原始值.我不想使用隐藏字段来存储它们.使用我现有的解决方案,我使用了隐藏字段,但它可以在POST请求之前在DOM中进行修改,因此它不安全.

Ant*_*Chu 8

db.Entry(account).State = EntityState.Modified将模型附加到上下文,所有属性都标记为已修改.尝试将其添加到未更改状态,并将可修改的字段设置为已修改.

[HttpPost]
public ActionResult Edit(Account account)
{
    if (ModelState.IsValid)
    {
        db.Accounts.Attach(account);

        db.Entry(account).Property(a => a.Name).IsModified = true;
        db.Entry(account).Property(a => a.TimeOffset).IsModified = true;
        db.Entry(account).Property(a => a.Status).IsModified = true;

        account.ModifiedOn = DateTime.Now;
        account.ModifiedBy = 1;

        db.SaveChanges();

        return RedirectToAction("Index");
    }

    return View(account);
}
Run Code Online (Sandbox Code Playgroud)